目录
1 用尾递归算法求解Fibonacci数列的第n项
代码:
#include <bits/stdc++.h>
using namespace std;
/*尾递归算法求解Fibonacci数列*/
int Fibonacci(int n, int m, int a, int b) {
if (n == 0) {
return a;
} else {
return Fibonacci(n - 1, m + 1, a + b, a);
}
}
int main () {
cout << "请输入要求解的斐波拉契数列的项数:";
int n;
cin >> n;
cout << "斐波拉契数列的第n项为:";
if (n == 0) {
cout << 1 << endl;
} else {
--n;
cout << Fibonacci(n, 1, 1, 1) << endl;
}
return 0;
}
结果截图:
算法思路:
n为需要递归的次数,m为a的项数,a为m项的数值,b为m-1项的数值。每进行一次递归,m的值加1,a由原来的m项的值变为m+1项的值,b变为原来a的值,直至递归次数用尽,m即为所需项,a即为所需值。
运行过程:
Fibonacci(n, m, 1, 1)->Fibonacci(n - 1, m + 1, 2, 1)->……->Fibonacci(0, n + m, F(n + m), F(n + m - 1))
2 用递归算法实现分黑球问题
代码:
#include <bits/stdc++.h>
using namespace std;
/*递归算法实现分黑球问题*/
int BlackBall(int numBall, int numBox, int index) {
if(numBox == 0) {
if (numBall == 0) {
return 1;
} else {
return 0;
}
} else {
int res = 0;
if (index == -1) {
for (int i = 0; i <= numBall; ++i) {
res += BlackBall(numBall - i, numBox - 1, i);
}
return res;
} else {
for (int k = 0; k <= min(numBall, index); ++k) {
res += BlackBall(numBall - k, numBox - 1, k);
}
return res;
}
}
}
int main() {
int numBall, numBox;
cout << "请输入黑球的个数:";
cin >> numBall;
cout << "请输入箱子的个数:";
cin >> numBox;
cout << "有效的放置方法有" << BlackBall(numBall, numBox, -1) << "种" << endl;
return 0;
}
结果截图:
算法思路:
因为类似1,2,3和3,2,1的放法是同一种放法,因此,为了避免重复,可以通过保证前一个盒子里面的球个数永远大于等于下一个盒子里面球的个数,并且保证下一个盒子的球数不超过现有球的数量来解决。在不断的存放过程中,如果存放到最后有球剩余显然是不成功的放法,返回0,反之,返回1。通过累加得到最终合理的存放方法数。