约瑟夫问题的递归公式

1,2....N  f(N) = ?

1. N = 3k

   1,2,4,5..............3k-2 3k-1 剩下 2 * N / 3个。r = f(2k)

   则f(N) = ((r-1)/2) * 3 + 2 - r%2

2. N = 3k + 1, r = f(2k+1)
   则 if r = 1
    f(N) = 3k+1;
      else
        f(N) = ((r-2)/2) * 3 + 2 - (r-1)%2

3. N = 3k+2,r = f(2k+2)
    if r = 1
       f(N) = 3k+1
    else if r = 2
       f(N) = 3k+2
    else

       f(N) = ((r-3)/2) * 3 +2 - (r-2)%2

 1 
 2  #include  < iostream >
 3  using   namespace  std;
 4 
 5  int  f( int  n)
 6  {
 7       if (n  ==   2 )
 8           return   2 ;
 9       int  k  =  n  /   3 ;
10       if (n  %   3   ==   0 )
11      {
12           int  r  =  f( 2 * k);
13           return  ((r  -   1 ) / 2 *   3   +   2   -  r % 2 ;
14      } else   if (n % 3   ==   1 )
15      {
16           int  r  =  f( 2 * k + 1 );
17           if  (r  ==   1 )
18               return   3 * k + 1 ;
19           return  ((r  -   2 ) / 2 *   3   +   2   -  (r - 1 ) % 2 ;
20      }
21       else {
22           int  r  =  f( 2 * k + 2 );
23           if  (r  ==   1 )
24          {
25               return   3 * k + 1 ;
26          }
27           if  (r  ==   2 )
28          {
29               return   3 * k + 2 ;
30          }
31           return  ((r  -   3 ) / 2 *   3   +   2   -  (r - 2 ) % 2 ;
32      }
33  }
34  int  main()
35  {
36      cout  <<  f( 17 <<  endl;
37       return   0 ;
38  }


 

转载于:https://www.cnblogs.com/speedmancs/archive/2010/10/14/1851751.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值