递归
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.考虑尾递归