约瑟夫问题的递归公式
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
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 }
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 阅读(1461) 评论(0) 编辑 收藏 举报