首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >约瑟夫斯问题递归实现的解释

约瑟夫斯问题递归实现的解释
EN

Stack Overflow用户
提问于 2015-08-02 19:12:46
回答 2查看 9.7K关注 0票数 25

编辑:n是人数。K是被淘汰的kth人员。因此,对于k=2,每2个人就会被淘汰。

代码语言:javascript
复制
int josephus(int n, int k)
{
 if (n == 1)
  return 1;
else
   return (josephus(n - 1, k) + k-1) % n + 1;
}

代码尽可能简单。但不知何故,我无法理解这个问题(老实说,这有点让人难堪)。

我想要理解的是,

  1. josephus(n,k)给出了n和步长k的种群的最终解。
  2. 如果我们知道约瑟夫斯(n-1,k)的解,就可以计算约瑟夫斯(n,k)。这在我看来是动态规划的“最优子结构性质”。
  3. 我得到,我们需要做一个MOD n,以便当数超过n时,它将再次从1开始计数。(即,确保加法的行为就像我们在一个圆圈中计数)。但我们为什么要加这个"k-1"?

主要问题是,如果我们知道约瑟夫斯(n-1,k)的正确解,我们如何计算约瑟夫斯(n,k)的解。我们已经有效地增加了一个人的人口,并以某种方式增加这个k-1值给了我正确的解决方案(让我们暂时忽略mod )。

有人能向我解释这一点吗?在问题的每一步,最优的子结构属性是如何保持的?

EN

Stack Overflow用户

发布于 2021-08-18 20:12:38

我们需要调整k-1的位置,因为在kth被移除后,开始位置已经被k移动(第一个k-1被旋转到末端)。也就是说,初始位置pos变成pos。如果k= 3,(n-1,k)返回pos = 2,则原始位置应为pos +k= 5。

我们在公式中用k-1代替k,因为我们必须用mod(n):k= (k-1) %n+1。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31775604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档