约瑟夫问题的递归公式

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 }


 

posted on 2010-10-14 22:17  speedmancs  阅读(1457)  评论(0编辑  收藏  举报

导航