js递归原理之return

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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值