先看如下代碼:javascript
var a = 1; function multiply(n) { if (n <= 1) { return 1; } a = n * multiply(n - 1); console.log('n:' + n); console.log('a:' + a); } console.log(multiply(5))
打開chrome瀏覽器斷點調試,觀看js執行過程
java
//代碼執行過程 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
將代碼修改一下:chrome
var a = 1; function multiply(n) { if (n <= 1) { return 1; } 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。spa
因此示例代碼的正確寫法是:調試
function multiply(n) { if (n <= 1) { return 1; } return n * multiply(n - 1); }