递归
To Iterate is Human, to Recurse, Divine
递归的定义
递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法
递归的三三要素
1.明确的函数要干什么
2.明确终止条件
3.提取重复逻辑,去找等价关系
递归思想的精髓
递归:递是传递传递的意思,参数需要传递到下一层去,如果把递归形容成用要是打开一扇一扇的门的话,传递的就是钥匙;
归有归还的意思,打开所有的门需要把最终的目的归还到问题开始的地方。递归的精髓是对问题的解读,需要抽象出重复的
问题和现象,通过反复的调用将结果返回。
递归的经典例子
1.阶乘
f(int n){
if(n==1)return 1;
return n*f(n-1);
}
2.斐波那契数列
f(int n){
if(n==1||n==2){
return 1;
}
return f(n-1)+f(n-2);
}
3.杨辉三角
f(int x,iny){
if(y<=x&&y>=0){
if(y==0||y==x){
return 1;
}else{
return f(x-1,y-1)+f(x-1,y);
}
}
return -1;
}
4.汉诺塔问题
f(int level,String begin,String end){
if(level==1){
//结束
}else{
//倒数第二层移到b
f(level-1,a,b);
//再从b移到c
f(level-1,b,c)
}
}
5.二叉树深度
f(Tree t){
if(t==null){
return 0;
}
int left=f(t.left);
int right=f(t.right);
return left>right?left+1:right+1;
}
递归的优化算法
1.考虑重复计算的问题
2.考虑尾递归