js递归道理之return
先看以下代码:
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实行历程
//代码实行历程
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) {
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。
所以示例代码的准确写法是:
function multiply(n) {
if (n <= 1) {
return 1;
}
return n * multiply(n - 1);
}