//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;}
新聞熱點
疑難解答