首页 > 编程 > JavaScript > 正文

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

2019-11-06 06:12:45
字体:
来源:转载
供稿:网友

递归(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项的时候,值为1function 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;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表