版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011987219/article/details/49538119
约瑟夫环递归求解
题目
约瑟夫环是一个数学的应用问题:已知m个人(以编号1,2,3...m分别表示)围坐在一张圆桌周围。从编号1开始报数,每次报到k的那个人出列,然后下一个人再从1开始报数。求解:最后一个出列的人的编号。
解题思路
使用递归
假设有10个人,编号为1、2、3、4、5、6、7、8、9、10,k=3。从1开始报数,则第一次出列的人的编号为3。从下一个人又从1开始报数。则第一个人出列之后的序列为:
4 5 6 7 8 9 10 1 2 (*)
对应的顺序序列为:1 2 3 4 5 6 7 8 9 (**)
可以发现:[(*)+k]%m = (),也就是说,m个人围成的环第i次出来的人的编号是m-1个人第i-1次出来的人的编号+k,然后模m。
设第i次出列的人的编号为f(m,k,i),则:
当i=1时,f(m,k,i)=(m+k)%m
当i!=1时,f(m,k,i) = [f(m-1,k,i-1)+k]%m
编程实现
private static int Joseph(int m, int k, int i)
{
if (i == 1)
return (m + k-1) % m;
else
return (Joseph(m - 1, k, i - 1) + k) % m;
}
static void Main(string[] args)
{
Console.WriteLine("请输入m,k");
int m = int.Parse(Console.ReadLine());
int k = int.Parse(Console.ReadLine());
for (int i = 1; i <= 10; i++)
{
Console.WriteLine( Joseph(m,k,i)+1);
}
Console.Read();
}