难以理解这种递归

时间:2017-11-09 05:13:27

标签: javascript recursion

我需要使用递归找到数组中的整数之和。 以下代码引发错误:

var sum = function(array) {
    if(array.length === 0) return 0;
    while(array.length) {
        sum = array[0] + sum(array.slice(1));
        return sum;
    }
}

虽然这有效:

var sum = function(array) {
    if(array.length === 0) return 0;
    while(array.length) {
        return array[0] + sum(array.slice(1));
    }
}

不同之处在于退还总和的方式。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

如注释中所述,while循环从不循环 - 它在第二次测试循环条件之前执行return语句。

即便如此,为什么第一个版本第一次调用它而不是第二个版本?

sum = array[0] + sum(array.slice(1));
在对sum的函数调用返回后,

将右手表达式值存储在sum中。该变量在范围内,因此赋值有效。

但是,在调用sum(在右侧)返回之后,才会发生分配。每次sum返回时,赋值都会用部分覆盖变量sum,最终覆盖最终结果。

因此第一次调用成功,但将sum设置为第一次调用的结果。由于您无法呼叫号码,因此第二次呼叫时会出错。