我需要使用递归找到数组中的整数之和。 以下代码引发错误:
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));
}
}
不同之处在于退还总和的方式。有人可以解释一下吗?
答案 0 :(得分:0)
如注释中所述,while循环从不循环 - 它在第二次测试循环条件之前执行return语句。
即便如此,为什么第一个版本第一次调用它而不是第二个版本?
sum = array[0] + sum(array.slice(1));
在对sum
的函数调用返回后,将右手表达式值存储在sum
中。该变量在范围内,因此赋值有效。
但是,在调用sum
(在右侧)返回之后,才会发生分配。每次sum
返回时,赋值都会用部分覆盖变量sum
,最终覆盖最终结果。
因此第一次调用成功,但将sum
设置为第一次调用的结果。由于您无法呼叫号码,因此第二次呼叫时会出错。