这个答案既是约瑟夫斯问题的总结,也是对您以下问题的回答:
josephus(n-1,k)
指的是什么?
- 模数运算符的用途是什么?
调用时josephus(n-1,k)
,这意味着您已经执行了每个第 k 个人,总共执行了 n-1 次。(更改为匹配乔治汤姆林森的评论)
递归继续进行,直到有 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
这表明 josephus(n-1,k) 指的是最后一个幸存者的位置。(1)
如果我们删除了模运算符,那么您会看到这将返回第 11 个位置,但这里只有 6 个,因此模运算符有助于将计数保持在圆的范围内。(2)