约瑟夫问题可以通过以下递归来解决:
josephus(n, k) = (josephus(n - 1, k) + k-1) % n + 1
josephus(1, k) = 1
这种递归关系是如何推导出来的?
约瑟夫(n,k)=(约瑟夫(n-1,k)+k-1)%n+1。。。。。。(1)
简单地说——从公式中的"+1"开始。这意味着已经完成了递归的1次迭代。现在,我们只剩下n-1个人/元素。我们需要以k的间隔递归地处理n-1个元素。但是,现在,由于最后一个要删除的元素在第k个位置,我们将从中继续。因此,增加了k-1。此外,此添加可能会打乱数组的索引。因此%n已将数组索引保持在界限内。希望它足够清晰和详细:)。
这段话在维基百科上已经足够了。。
当指数从1开始时,s处的人从第一人称位于位置((s-1)\bmod n)+1,其中n是总数人数。设f(n,k)表示幸存者的位置。第k个人被杀后,我们只剩下一个n-1的圆圈我们从原始号码中的人开始下一次计数问题是(k\bmod n)+1。幸存者在如果我们从1开始计数,剩下的圆将是f(n-1,k);将其转换为考虑到我们从(k\bmod)开始的事实n) +1产生递归
f(n,k)=((f(n-1,k)+k-1) bmod n)+1,text{ with }f(1,k)=1,,