約瑟夫環遞歸求解
題目
約瑟夫環是一個數學的應用問題:已知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();
}