我知道模给出余数,这个代码将给出约瑟夫问题的幸存者。我注意到一个模式,当n mod k=0时,开始计数点从圆圈的最开始开始,当n mod k=1时,圆圈开始之前的人在圆圈中存活下来。
我只是不明白这种递归是如何使用模来找到最后一个站着的人,以及约瑟夫斯(n-1,k)实际上指的是什么。是指最后一个被处决的人,还是指某一轮中最后一个幸存者?

 def josephus( n, k):
  if n ==1:
    return 1
  else:
    return ((josephus(n-1,k)+k-1) % n)+1

最佳答案

这个答案既是约瑟夫斯问题的总结,也是对你的问题的回答:
josephus(n-1,k)指的是什么?
模运算符用于什么?
当你打电话给josephus(n-1,k)时,这意味着你已经处决了每一个kth的人多达n-1次(与乔治·汤姆林森的评论一致)
递归一直进行到有一个人站着,当函数返回到顶部时,它将返回您必须处于的位置才能生存。模运算符用于帮助保持在圆内(正如GuyGreer在评论中解释的那样)以下图片有助于解释:

 1 2
6   3
 5 4

设n=6和k=2(圈中每2人执行一次)。首先运行函数一次,然后执行第二个人,圆圈变为:
 1 X
6   3
 5 4

继续递归,直到最后一个人留下,将导致以下顺序:
 1 2      1 X      1 X      1 X      1 X      X X
6   3 -> 6   3 -> 6   3 -> X   3 -> X   X -> X   X
 5 4      5 4      5 X      5 X      5 X      5 X

当我们检查josephus在n返回的值时,得到以下值:
n = 1 return 1
n = 2 return (1 + 2 - 1) % 2 + 1 = 1
n = 3 return (1 + 2 - 1) % 3 + 1 = 3
n = 4 return (3 + 2 - 1) % 4 + 1 = 1
n = 5 return (1 + 2 - 1) % 5 + 1 = 3
n = 6 return (3 + 2 - 1) % 6 + 1 = 5

这表明约瑟夫斯(n-1,k)指的是最后一个幸存者的位置。(一)
如果我们去掉模算子,你会看到这将返回第11个位置,但这里只有6个,所以模算子有助于保持计数在圆的边界内(二)

07-24 04:50