JavaScript 递归,反转数组

标签 javascript recursion

我不明白为什么以下代码片段会导致错误。有什么想法吗?

Maximum call stack size exceeded

function reverseArrayInPlace(array, low, high) {
  if (low == undefined) {
    low = 0;
  }
  if (high == undefined) {
    high = array.length - 1;
  }

  if (low >= high) {
    return;
  }

  var temp = array[low];
  array[low] = array[high];
  array[high] = temp;

  return reverseArrayInPlace(array, low++, high--);
}

var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);

最佳答案

这是因为你使用了后自增和后自减。它递增/递减变量,但返回旧值,因此您在递归中传递旧值。因此,递归调用与原始调用相同,并且可以无限递归。

预递增/递减 - ++low--high - 可以正常工作。但您根本不需要更新变量,因为您再也不会使用它们。只需进行正常的加法/减法即可。

在进行递归调用时,使用 returnverseArrayInPlace() 也是没有意义的,因为基本情况不会返回任何内容。只需进行递归调用,而不将其放入 return 语句中即可。

function reverseArrayInPlace(array, low, high) {
  if (low == undefined) {
    low = 0;
  }
  if (high == undefined) {
    high = array.length - 1;
  }

  if (low >= high) {
    return;
  }

  var temp = array[low];
  array[low] = array[high];
  array[high] = temp;

  reverseArrayInPlace(array, low + 1, high - 1);
}

var arrayValue = [1, 2, 3, 4, 5];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);

关于JavaScript 递归,反转数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43414137/

相关文章:

recursion - 我的消息传递示例有什么问题?

python - Python递归期间的内存使用

javascript - 仅当未触发另一个鼠标悬停事件时,如何才能为 jquery mouseout 事件创建异常?

c - 在 C 中构建字符串

javascript - XSLT if 语句不正确匹配

javascript - 自动更新提交日期的 timeAgo 值

javascript - 递归/嵌套函数 - 参数范围

java - 以递减方式打印数字,然后打印最多 n 的阶乘

javascript - 停止多次播放动画

javascript - firestore 添加数据两次并且不让我拥有 UID