JavaScript 递归(栈结构/化归思想)

递归

(1)概念:函数自己调用自己

(2)问题存在:容易出现死递归,是循环的递归下去,内存不够就报错: 栈溢出
//1.直接调用自己
function foo1(){
    foo1();
}
foo1();
//2.间接调用自己
function foo2(){
    foo3();
}
function foo3(){
    foo4();
}
function foo4(){
    foo2();
}
foo2();

栈结构
特点:先入后出
function f1(){
    f2();
    console.log('f1 finish');
}
function f2(){
    f3();
    console.log('f2 finish');
}
function f3(){
    console.log('f3 finish');
}
f1();//f3 finish     f2 finish     f1 finish

//将函数调用称为调用栈


(3)递归要实现需要解决两个问题
1> 停止的条件(解决栈溢出)
2> 如何调用自己

(4)   化归的思想( 转化为已归纳好的办法):
对问题进行变形、转化,转换成已经解决的问题,然后直接调用解决好的方法即可。
所谓的递归其实就是化归。

(5)如何写递归?
1> 假设这个问题已经解决,即使写一个空函数也假设已经解决
2> 根据规律(可能要写两到三次),写出化归的表达式,即递归体
3> 确定临界条件

案例:求1,3,5,7,...第n项的值,从0开始
//1> 假设问题已经解决,肯定需要一个函数,带有一个参数,返回一个结果
function foo(n){  }
//2> 要求第n项,根据规律就是 第n-1项 + 2
就是要求 第n-1项,即 foo(n-1) 就是结果
因此得到函数体(递归体)
function foo(n){ 
    return foo(n-1) + 2;
}
//3> 确定临界条件,就是在第0项的时候,值为1
function foo(n){ 
    if(n==0) return 1;
    return foo(n-1) + 2;
}



/*
* 练习1:求1,2,4,8,16, ...第n项的值,从0开始
* */
/*1.假设问题已解决,需要一个带参的函数,有返回值*/
function foo(n){
    /*3.临界条件:第0项时值为1*/
    if(n==0) return 1;
    /*2.规律是第n-1项乘以2*/
    return foo(n-1)*2;
}
/*
* 练习2:求1到n的和
* */
function foo2(n){
    if(n==1) return 1;
    return foo2(n-1)+n;
}

/*
* 练习3:fibonacci数列,求第n项
* */
function foo3(n){
    if( n==1 || n==2 ) return 1;
    return foo3(n-1)+foo3(n-2);
}

/*
* 练习4:求阶乘
* */
function foo4(n){
    if(n==1) return 1;
    return foo4(n-1)*n;
}

/*
* 练习5:求幂,就是n的m次方
* */
function foo5(n,m){
    if(m==0) return 1;
    return foo5(n,m-1)*n;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值