题目
走n个台阶,每次可以走一步或者两步,有多少钟走法
递归公式
f(1) = 1;
f(2) = 2;
f(n) = f(n-1)+f(n-2)
代码实现
int f(int n){
if(n1) return 1;
if(n2) return 2;
return f(n-1)+f(n-2);
}
满足递归的三个条件
- 一个问题的解可以分解为几个子问题的解
- 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
- 存在递归终止条件
注意
避免堆栈溢出
可以限制递归深度
避免重复计算
可以采用一种散列表,将每次的计算结果存入散列表中,每次在计算之前先判断散列表是否有之前的计算结果,如果有直接返回。
递归拆分
迭代循环
上面代码的非递归方式
int f(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
int ret = 0;
int pre = 2;
int prepre = 1;
for (int i = 3; i <= n; ++i) {
ret = pre + prepre;
prepre = pre;
pre = ret;
}
return ret;
}
总结:
写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此
写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。