約瑟夫環遞歸求解

約瑟夫環遞歸求解

題目

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