javascript - 非常大的递归javascript

标签 javascript recursion promise

我有这段代码,它通过递归计算数组元素总和,但是当数组太大时,它会抛出超过最大调用堆栈大小错误。

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/

相关文章:

reactjs - Suspense React 无法获取数据

javascript - 是否可以在 karma 测试期间禁用 firefox 错误消息

c - 在 C 中查找组合的最有效方法

javascript - 递归异步请求

javascript - 如何在 promise 中正确实现 mongodb async/await?

javascript - 如何从 Promise 中返回值

javascript-objects - 如何将对象字面量转换为函数

javascript - 如何在 Storybook 中模拟 Next.js Image 组件?

javascript - 根据文本字段输入的数据更改窗口的背景颜色

缓存与递归正交...解释一下?