上回相比於迴圈,遞迴的缺陷說到,尾遞迴,那麼什麼是尾遞迴呢?
百科中這麼解釋:說乙個函式中在函式末尾呼叫自己,並且該呼叫不是在表示式中,就可以稱為是尾遞迴。
現在來實現乙個尾遞迴:
function
tailrecsum
(x, sum =0)
return
tailrecsum
(x -
1, sum + x)
} console.
log(
tailrecsum
(100
))
這就是乙個尾遞迴,同樣可以用來求和。
暫且先不說它的效果怎麼樣,說說尾遞迴的好處吧。
有些編譯器是支援尾遞迴的,就是說如果你的**中寫了尾遞迴,那麼編譯的時候會在呼叫尾遞迴的時候把上乙個壓入棧中的該函式出棧,不會造成棧溢位的問題。
前提是:編譯器支援這種寫法
那麼問題又來了,前端的編譯器就是瀏覽器,瀏覽器支援嗎?
經測試:
chrome 不支援
firefox 不支援
safari 不支援
ie 不知道
so,這種寫法並沒有什麼用,在數字足夠大的時候,依然會造成棧溢位。
哎。。。
遞迴 尾遞迴
階乘函式 n n n 1 n 2 3 2 1 針對這樣的表述,直譯成乙個過程 define factorial n if n 1 1 n factorial n 1 如果是factorial 6 其計算行為是 factorial 6 6 factorial 5 6 5 factorial 4 6 5...
遞迴 尾遞迴
計算n的階乘 function add n return n function add n 1 斐波那契數列 1 1 2 3 5 8 13.function arr n else 如上例項,但是遞迴有乙個很大的問題,就是在不斷地呼叫自身函式時,每一次呼叫都會存新的資料變數等,如果有成百上千次呼叫,則...
尾呼叫 尾遞迴
首先什麼是尾呼叫呢?我的理解是在,函式的最後呼叫乙個函式,並不包含該函式的任何變數。如 def f n return g n 複製 這個就是尾呼叫,尾呼叫的乙個好處就是,不用生成呼叫棧,因為假設是個尾呼叫,那麼當我執行到函式末尾的時候,這個函式相關的資訊我都可以不用保留了,因此不會出現棧溢位的問題。...