JavaScript递归,反转数组

时间:2017-04-14 15:02:08

标签: javascript recursion

我无法理解为什么以下代码段会导致错误。有什么想法吗?

  

超出最大调用堆栈大小



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);




2 个答案:

答案 0 :(得分:7)

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

预增/减 - ++low--high - 可以正常工作。但是你根本不需要更新变量,因为你再也不用它们了。只做正常的加法/减法。

在进行递归调用时,使用return reverseArrayInPlace()也没有意义,因为基本情况不会返回任何内容。只需进行递归调用而不将其放在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);




答案 1 :(得分:0)

因为你必须在递归调用中使用++ low和--high。 在您的版本中,首先传递值然后修改。

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);