约瑟夫环递归求解

来源:互联网 发布:多商网淘宝代销赚钱吗 编辑:程序博客网 时间:2024/05/22 07:45

约瑟夫环递归求解

题目

约瑟夫环是一个数学的应用问题:已知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();         }
0 0
原创粉丝点击