递推与递归的核心都是同一个“递推公式”,只不过入手的方向不一样。
我们正常的思路就是递推:由已知的1根据递推公式推出2,由2推出3,由3推出4……直到求得题目要求的第n项,是从1---->n。
而递归,是从n---->1---->n。它是使用计算机工具时的一种技巧,其实还是解上面这个问题,但是把第n项与第n-1项的关系写出来就可以,具体来说就是这句:return (f(n - 1) + 1) * 2;思路好办,最后想求出结果还得落实到第一项,因为第一项是已知的,比如=1,加上这句: if (n==1)return 1;就写完了。对比以下代码:
#include <iostream>
using namespace std;
int f(int n) { //递推函数写完,一会儿调用一下就OK了。
if (n==1)return 1;
return (f(n - 1) + 1) * 2;
}
int main() {
int n; //递推,求第n项,这个根据题目自己输入,a=1是第一项的值。
cin >> n;
int a = 1;
for (int i = 1; i < n; i++)
a = (a + 1) * 2; //核心——递推函数
cout << a << endl;
//------------------------------
cout << f(n) << endl; //递归
}
基本说清楚了吧?
以上这道题最简单,递归先压栈,再弹栈,压入的过程占用了很多内存,比起递推就差着了,从弹栈开始其实就是递推的过程——从1到n的过程。所以没有必要用递归就别用。但是以后遇到复杂问题时,递归代码很好写,这是它的优点。