首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Josephus算法

Josephus算法
EN

Stack Overflow用户
提问于 2015-07-27 23:33:55
回答 1查看 10K关注 0票数 0

我在读Josephus Problem的算法。

我遇到了以下算法:

代码语言:javascript
复制
int josephusIteration(int n,int k) {
    int a=1;
    for(int i=1;i<=n;i++) {
        a=(a+k-1)%i+1;
    }
    return a;
}

我不能理解它的逻辑。假设n=5和k=2。

代码语言:javascript
复制
i=1, a=1
i=2, a=1
i=3, a=3
i=4, a=1
i=5, a=3

有没有人能举个例子来解释一下?

EN

回答 1

Stack Overflow用户

发布于 2015-07-27 23:50:00

如果为n = 5k = 2,则安全位置为3。首先,杀死位置2的人,然后杀死位置4的人,然后杀死位置1的人。最后,位置5的人被杀死。所以位置3的人幸免于难。

我已经读过你的代码,但我想在下面建议一个更容易理解的递归解决方案。

代码语言:javascript
复制
// this function returns the position of the person alive
int josephus(int n, int k)
{
  if (n == 1)
    return 1;
  else
    /* The position returned by josephus(n - 1, k) is adjusted because the
       recursive call josephus(n - 1, k) considers the original position 
       k%n + 1 as position 1 */
    return (josephus(n - 1, k) + k-1) % n + 1;
}

在第一个人(从一开始就是第k个)被杀后,剩下n-1个人。因此,我们调用josephus(n – 1, k)来获得n-1个人的职位。

josephus(n – 1, k)返回的位置将从位置1再次考虑。因此,我们将k-1添加到该位置,并将其模取为n,因为存在n元素,并添加1以使位置为1-indexed而不是0-indexed

参考:http://www.geeksforgeeks.org/josephus-problem-set-1-a-on-solution/

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31657262

复制
相关文章

相似问题

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