给定一个用户ID,如何查找其“最终推荐人”
递归
典型递推公式:f(n)=f(n-1)+1,f(1)=1
递归代码
int f(int n){
if (n==1) return 1;
return f(n-1)+1;
}
递归的三个条件
1.一个问题的解可以分解为几个子问题
2.子问题与原问题,除了数据规模,求解思路完全一样
3.存在递归终止条件
如何写递归代码
关键:(1)递推公式,(2)终止条件
以走楼梯为例,n阶楼梯,可以一步一阶或者一步2阶,有多少种走法?
递推公式:f(n)=f(n-1)+f(n-2),表示第一步走一阶的走法数+第一步走2阶的走法数
终止条件:f(1)=1,此外用f(2)验证,发现f(0)的值也需要给出,f(0)=1,但是不符合逻辑,所以应该是f(2)=2。
递归代码:
int f(int n){
if (n==1) return 1;
if (n==2) return 2;
return f(n-1)+f(n-2);
}
关键:遇到需要递归的部分,将其抽象成一个递归公式,不要考虑公式内部的层层关系,也就是先“假设子问题已经存在解决方法”,再来写当前问题的解法代码
PS:通过限制递归调用的最大深度,避免堆栈溢出
防止递归中的重复计算
在走楼梯问题中,存在大量的重复计算、