走进递归的世界
从前有座山,山上有座庙,庙里有个老和尚和小和尚,老和尚正在给小和尚讲故事。从前有座山......这里就存在方法定义中调用函数方法本身的现象。递归分两步,递和归。它会消耗很多堆栈空间和函数调用时间,因为递归可以产生无限的循环体,每一次它的返回值会占用一定得空间
一.递归需要满足的条件
并不是所有问题都可以用递归来解决。那么什么样的问题可以用递归来解决呢?一般来讲,能用递归来解决的问题必须满足两个条件:
l 可以通过递归调用缩小问题规模,并且旧问题和新问题有着相同的形式
l 存在一种可以退出的情况
二. 递归的原理
递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。而递归算法的一般形式为:
function func(num){
if(endCondition){
constExpression //基本项
} else {
accumrateExpreesion //归纳项
num = expression //步进表达式
func(num) //调用函数本身
}
}
递归不仅是“自己调用自己”,还可以交互调用的递归,它更多的是一种分析和解决问题的方法和思想。递归的思想是:“把问题分解成为规模更小的,具有与原问题有着相同解法的问题。”
曾看到一个大神对递归的解释是这样的:”古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知,致知在格物。物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平。“ 对于递归的优化可以用到尾递归来进行优化。
并不是所有问题都能用递归来解决。那么什么样的问题可以用递归来解决呢?一般来讲,能用递归来解决的问题必须满足两个条件:
四.递归列子
4.1斐波那契数列。兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
function fac(n){
if(n==1||n==2){
return 1;
}
return fac(n-1)+fib(n-2);
}
4.2 阶乘。一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。自然数n的阶乘写作n!。
function factorial(n){
if(n == 1){
return 1;
}
return n * factorial(n- 1)