我有这段代码,它通过递归计算数组元素总和,但是当数组太大时,它会抛出超过最大调用堆栈大小错误。
var a = new Array(10 ** 7);
a.fill(0);
function sum(arr, i = 0) {
if(i === arr.length) {
return 0;
}
return arr[i] + sum(arr, i + 1);
}
sum(a);
因此,我需要以某种方式更改它,以便在所有情况下正常工作,并且我认为我可以使其与 Promise 异步工作,但它总是返回 Promise pending。
var a = new Array(10 ** 7);
a.fill(0);
var sum = (arr, i = 0) => new Promise((resolve) => {
setTimeout(() => {
if(i === arr.length) {
return resolve(0);
}
return sum(arr, i + 1).then(el => el + arr[i]);
}, 0);
});
sum(a);
如何修复它?
如有任何帮助,我们将不胜感激!
最佳答案
您仅解决 i 为 arr.length 的情况,因此所有链式 promise 永远处于未决状态。 Return 不会自动为我们解决这个问题,因此需要明确:
var a = new Array(10);
a.fill(0);
a[0] = 3;
var sum = (arr, i = 0) => new Promise((resolve) => {
setTimeout(() => {
if(i === arr.length) {
resolve(0);
} else {
resolve(sum(arr, i + 1).then(el => el + arr[i]));
}
}, 0);
});
sum(a).then(console.log)
关于javascript - 非常大的递归javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50916193/