特点:
1、 函数自己调用自己;
2、 一般情况下有参数;
3、 一般情况下有return;
递归可以解决循环解决的所有问题。
创建递归方法:
1.首先去找临界值,即无需计算,获得的值。
2.找这一次和上一次的关系
3.假设当前函数已经可以使用,调用自身计算上一次
例子:求0-100和
//普通for循环
function add(num){
var sum=0
for(var i=1;i<=num;i++)
{
sum+=i
}
return sum
}
console.log(add(100))
//递归解决:
function sum(n){
if(n==1){
return 1
}
return sum(n-1)+n
}
console.log(sum(100))
// sum(100)=sum(99)+100
内存虽然从sum(100)到sum(1)创建,但是时间很短。当然释放空间从sum(1)到sum(100)时间也很短。但是如果短时间内开的空间个数过多,销毁也会随之增加,就会造成递归爆栈。计算机时耗不起的。
练习
输出五次hello word:
function print(n)
{
if(n==0)
{
return;
}
console.log('hello world')
return print(n-1)
}
print(5)
斐波那契数列:
// 1 1 2 3 5 8
// Fibonacci(5)=Fibonacci(4)+Fibonacci(3)
function Fibonacci(n){
/* 找到临界值 */
if(n<=2){
return 1
}
/* 找到上一个和下一个关系 */
return Fibonacci(n-1)+Fibonacci(n-2)
}
console.log(Fibonacci(5))
猴子吃桃:桃子树未知,猴子第一天吃掉一半桃子,加一个,第二天一样吃掉一半桃子+一个 到第n天,桃子只有一个
// eat(n)/2-1=eat(n-1)
function eat(n){
//找到临界值
if(n==1){
return 1
}
//找到与上一个关系
return (eat(n-1)+1)*2
}
console.log(eat(4))