先看以下**:
var a = 1;
function multiply(n)
a = n * multiply(n - 1);
console.log('n:' + n);
console.log('a:' + a);
}console.log(multiply(5))
開啟chrome瀏覽器斷點除錯,**js執行過程
//**執行過程
a=n*multiply(n-1)//n=5 a=1
a=n*multiply(n-1)//n=4 a=1
a=n*multiply(n-1)//n=3 a=1
a=n*multiply(n-1)//n=2 a=1
a=n*multiply(n-1)//n=1 a=1 return 1
//此時函式開始向上回溯
a=n*multiply(n-1)//n=2 a=2*1=2
console.log('n:'+n)//n:2
console.log('a:'+a)//a:2 return undefined
a=n*multiply(n-1)//n=3 a=3*undefined=nan
console.log('n:'+n)//n:3
console.log('a:'+a)//a:nan return undefined
a=n*multiply(n-1)//n=4 a=4*undefined=nan
console.log('n:'+n)//n:4
console.log('a:'+a)//a:nan return undefined
a=n*multiply(n-1)//n=5 a=5*undefined=nan
console.log('n:'+n)//n:5
console.log('a:'+a)//a:nan return undefined
將**修改一下:
var a = 1;
function multiply(n)
a = n * multiply(n - 1);
console.log('n:' + n);
console.log('a:' + a);
return a;//每次將a返回
}console.log(multiply(5))
//**執行過程
a=n*multiply(n-1)//n=5 a=1
a=n*multiply(n-1)//n=4 a=1
a=n*multiply(n-1)//n=3 a=1
a=n*multiply(n-1)//n=2 a=1
a=n*multiply(n-1)//n=1 a=1 return 1
//此時函式開始向上回溯
a=n*multiply(n-1)//n=2 a=2*1=2
console.log('n:'+n)//n:2
console.log('a:'+a)//a:2 return 2
a=n*multiply(n-1)//n=3 a=3*2=6
console.log('n:'+n)//n:3
console.log('a:'+a)//a:6 return 6
a=n*multiply(n-1)//n=4 a=4*6=24
console.log('n:'+n)//n:4
console.log('a:'+a)//a:24 return 24
a=n*multiply(n-1)//n=5 a=5*24=120
console.log('n:'+n)//n:5
console.log('a:'+a)//a:120 return 120
總結:
所以在遞迴過程中,如果遞迴依賴上一次遞迴的結果,需要將結果return。
如果不需要上一次的結果,就不需要return。
所以示例**的正確寫法是:
function multiply(n)
return n * multiply(n - 1);
}
js遞迴原理
本部落格主要講述關於js的函式遞迴,主要從 變數 函式 和 函式 變數 兩個方面說明解釋。相對簡單,直接上 function fun fun 用遞迴 來求 5 的階乘 n n n 1 定義乙個函式,用於求 n 的階乘 function func n func n 1 因為傳遞的引數是 n 1,那麼就...
js遞迴呼叫注意return返回值
let depth 0function fc num const res fc 5 console.log res 2 我們可以使用迭代迴圈,去改寫遞迴,每次都去計算值,而不是將函式儲存在記憶體中等待呼叫,從而避免堆疊溢位。function fc num console.log res fc 6 f...
遞迴return的問題
遞迴的四條基本法則 引自 資料結構與演算法分析 c語言描述 mark allen weiss 著 1.基準情形。2.不斷推進。3.設計法則。4.合成效益法則。這裡說下return的作用域 return 對當前函式來說是結束了,對呼叫它的父函式來說你這個函式執行完成了,父函式就會接著執行下一語句。沒想...