假如这里有 n 个台阶,每次你可以跨 1 个台阶或者 2 个台阶,请问走这 n 个台阶有多少种走法?
分析问题
n = 1 时有一种走法
n = 2 时有两种走法
f(n) = f(n-1)+f(n-2)种走法
上编码:
public int taij(int n){
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
return taij(n - 1) + taij(n - 2);
}
以上代码,只能算伪代码,没有边界条件的判断,也没有重复计算的优化,如果实际使用,还需多多完善。
递归有利有弊,利是递归代码的表达力很强,写起来非常简洁;而弊就是空间复杂度高、有堆栈溢出的风险、存在重复计算、过多的函数调用会耗时较多等问题
递归需要满足的三个条件
- 一个问题的解可以分解为几个子问题的解
- 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
- 存在递归终止条件
注意事项
每调用一个函数,都会将临时变量封装为栈帧压入内存栈,等函数执行完成返回时,才出栈。系统栈或者虚拟机栈空间一般都不大。如果递归求解的数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。