關於JS中遞迴的相關問題

2021-09-02 01:37:08 字數 1544 閱讀 4390

假如在寫**過程中,需要用到乙個函式,要求n的階乘,像這種有規律,可以把複雜問題分解為乙個個小問題再一一解決的問題,這時候就可以用到遞迴。

程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在程式語言中廣泛應用。 乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。遞迴的能力在於用有限的語句來定義物件的無限集合。一般來說,遞迴需要有邊界條件、遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進;當邊界條件滿足時,遞迴返回。

上面是遞迴的定義,講起來很繞口,我們先不去看它,回歸問題本身,假如現在要求乙個n的階乘,設f(n)為n的階乘:

f(n) = n * f(n-1)

這時js中的遞迴思想是:**

1.總結規律即f(n) = n * f(n-1)**

那麼第一步可以先寫成這樣:

function mul(n)
即先把規律return出來。

2.找出口

如上述**,如果不找乙個出口停止上述運算的執行,那麼上述**會變成這樣:

n * n-1 * n-2 * … * 1 * 0 *-1 * …

n的階乘只相乘到n大於等於0時,這時我們容易發現當 n = 1時,n的階乘為1,n = 0 時,n的階乘為0

此時 n = 1 ||n = 0為此遞迴函式的突破口,那麼

function mul(n)  

return n * mul(n - 1);

}

mul函式的運算過程:先得n*(n-1)!

發現(n-1)!未知,遂向下繼續求(n-2)! 直到求得n=1時,得到一的階乘為1,再向上求得2的階乘,以此往上推到。可以發現n*n-1是最開始求的,但卻是最晚得出來的。這就顯現了遞迴的弊端,執行效率不高,占用記憶體。

就好比老媽讓我去鄰居家要點味精,我去了左邊的鄰居a家,a說沒有了,a讓我去他的左邊隔壁b家,b家也沒有讓我去他的左邊隔壁c家,以此類推,直到遇上了那位有味精的鄰居,可這時我離家已經越來越遠,又得走回去,途中還經過c,b,a家,最後才回到家中,效率非常低。

上述**也顯現了遞迴**的精簡性,往往短短幾行就能解決用幾十行for迴圈巢狀才能解決的問題。

最後再複述一下,遞迴的寫法兩個步驟:

1.return規律

2.return出口

下面是用遞迴寫乙個實現斐波那契數列的函式

function fb(n) 

return fb(n - 1) + fb(n - 2);

}

1:找規律,fb(n)=fb(n-1)+fb(n-2),return 出規律

2:找出口,fb(3) = fb(1)+fb(2)

fb(1)=1,fb(2)=1

遂得出以上**。

分享學習筆記,如有錯誤請大佬指出,嘻嘻。

JS中遞迴函式 JS函式相關及遞迴函式的使用

js中的遞迴函式詳解 舉個例子,1 2 3 4 5 用遞迴函式來完成 function fn n else console.log fn 5 我們把fn 5 解剖開,得出,不滿足n 1,所以執行的是 else裡的語句 return n fn n 1 現在我們看else裡面的執行,最後是return ...

JS中關於陣列的相關api

var array 1,2,3,4,5 var flag array.every function element,index,arr flag結果為false,因為當index 4時不滿足,故最後結果為false var array 1,2,3,4,5 var newarr array.filte...

關於js中 的小問題

先看下面兩個 為什麼第一行正常 編譯 執行 但第二行給出錯誤?注意是 referenceerror。0 uncaught referenceerror invalid left hand side expression in postfix operation 第一想法 0 應該和 是一樣的,所以兩...