C++ 约瑟夫算法
我正在读这个算法 我遇到了以下算法:C++ 约瑟夫算法,c++,c,algorithm,josephus,C++,C,Algorithm,Josephus,我正在读这个算法 我遇到了以下算法: 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,那么安全位置是3。首先,位置2的人被杀,然后位置4的人被杀,然后位置1的人被杀。最后,5号位置的人被杀。所以位置3的人活了下来 我已经阅读了您的代码,但我想建议下面的递归
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
,那么安全位置是3
。首先,位置2的人被杀,然后位置4的人被杀,然后位置1的人被杀。最后,5号位置的人被杀。所以位置3的人活了下来
我已经阅读了您的代码,但我想建议下面的递归解决方案更容易理解
// 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人的职位
<代码>约瑟夫斯(n-1,k)< /代码>返回的位置将从位置1重新考虑。因此,我们向其添加k-1
,并使用n
取其模,因为存在n
元素,并添加1以使位置1-索引
,而不是0-索引
参考:如果
n=5
和k=2
,则安全位置为3
。首先,位置2的人被杀,然后位置4的人被杀,然后位置1的人被杀。最后,5号位置的人被杀。所以位置3的人活了下来
我已经阅读了您的代码,但我想建议下面的递归解决方案更容易理解
// 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人的职位
<代码>约瑟夫斯(n-1,k)< /代码>返回的位置将从位置1重新考虑。因此,我们向其添加k-1
,并使用n
取其模,因为存在n
元素,并添加1以使位置1-索引
,而不是0-索引
参考资料:您在理解约瑟夫斯问题时有什么问题吗?还是您特别想了解这个特定的算法。我这样问是因为它有一个更容易理解的递归解决方案。我在理解问题本身时遇到了一个问题。我的意思是为什么它一直在用%I?a代表每一次迭代吗?我代表的是从只剩下一次迭代的点向后计算的活着的人数。非递归解决方案的关键是在执行过程中向后工作。模i是因为我们在每一步都有一个圆,并计算圆周围的k个位置。“a代表将存活下来的人在圈子中的位置。”RichaTibrewal阅读下面我的答案,了解约瑟夫问题的递归解。如果你不完全理解,请告诉我。你在理解约瑟夫斯问题时有问题吗?或者你特别想理解这个特殊的算法吗。我这样问是因为它有一个更容易理解的递归解决方案。我在理解问题本身时遇到了一个问题。我的意思是为什么它一直在用%I?a代表每一次迭代吗?我代表的是从只剩下一次迭代的点向后计算的活着的人数。非递归解决方案的关键是在执行过程中向后工作。模i是因为我们在每一步都有一个圆,并计算圆周围的k个位置。“a代表将存活下来的人在圈子中的位置。”RichaTibrewal阅读下面我的答案,了解约瑟夫问题的递归解。“如果您不完全理解,请告诉我。从Geeksforgeks处复制。”BlackBird添加了参考资料。我已经添加到网站上提到的解释中。@RichaTibrewal您需要首先了解为什么我们在前面的值中添加
k-1
。然后执行%i
以确保返回的值在[1,i]范围内。从Geeksforgeks复制。@BlackBird添加了引用。我已经添加到网站上提到的解释中。@RichaTibrewal您需要首先了解为什么我们在前面的值中添加k-1
。然后执行%i
,以确保返回的值在范围[1,i]内。