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=1a=n*multiply(n-1)//n=4 a=1a=n*multiply(n-1)//n=3 a=1a=n*multiply(n-1)//n=2 a=1a=n*multiply(n-1)//n=1 a=1 return 1//此时函数开始向上回溯a=n*multiply(n-1)//n=2 a=2*1=2console.log('n:'+n)//n:2console.log('a:'+a)//a:2 return undefineda=n*multiply(n-1)//n=3 a=3*undefined=NaNconsole.log('n:'+n)//n:3console.log('a:'+a)//a:NaN return undefineda=n*multiply(n-1)//n=4 a=4*undefined=NaNconsole.log('n:'+n)//n:4console.log('a:'+a)//a:NaN return undefineda=n*multiply(n-1)//n=5 a=5*undefined=NaNconsole.log('n:'+n)//n:5console.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=1a=n*multiply(n-1)//n=4 a=1a=n*multiply(n-1)//n=3 a=1a=n*multiply(n-1)//n=2 a=1a=n*multiply(n-1)//n=1 a=1 return 1//此时函数开始向上回溯a=n*multiply(n-1)//n=2 a=2*1=2console.log('n:'+n)//n:2console.log('a:'+a)//a:2 return 2a=n*multiply(n-1)//n=3 a=3*2=6console.log('n:'+n)//n:3console.log('a:'+a)//a:6 return 6a=n*multiply(n-1)//n=4 a=4*6=24console.log('n:'+n)//n:4console.log('a:'+a)//a:24 return 24a=n*multiply(n-1)//n=5 a=5*24=120console.log('n:'+n)//n:5console.log('a:'+a)//a:120 return 120
总结:
所以在递归过程中,如果递归依赖上一次递归的结果,需要将结果return。
如果不需要上一次的结果,就不需要return。
所以示例代码的正确写法是:
function multiply(n) { if (n <= 1) { return 1; } return n * multiply(n - 1);}