约瑟夫环递归求解

版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
         }

猜你喜欢

转载自blog.csdn.net/u011987219/article/details/49538119