//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;}
新闻热点
疑难解答