QuickSort无限循环,如果我使用2015年之前的方法在函数内部声明参数默认值,但如果我使用ES2015默认参数值,则可以正常工作

问题描述 投票:0回答:1

我一直在尝试实现quickSort函数并使所有工作正常。但是有一个特殊之处,我无法缠住头或无法理解原因。

在第一段代码中,您将看到我已经为quickSort()函数声明了一些默认参数值:

function swap(arr, firstIndex, secondIndex) {
  let temp = arr[firstIndex];
  arr[firstIndex] = arr[secondIndex];
  arr[secondIndex] = temp;
}

function pivot(arr, start = 0, end = arr.length - 1) {
  // We are assuming that the pivot is always the first element
  let pivot = arr[start];
  let swapIndex = start;

  for (let i = start + 1; i <= end; i++) {
    if (pivot > arr[i]) {
      swapIndex++;
      swap(arr, swapIndex, i);
    }
  }

  // Swap the starting element with the pivot index
  swap(arr, start, swapIndex);
  return swapIndex;
}

function quickSort(arr, left = 0, right = arr.length - 1) {
  if (left < right) {
    let pivotIndex = pivot(arr, left, right);
    // left
    quickSort(arr, left, pivotIndex - 1);
    // right
    quickSort(arr, pivotIndex + 1, right);
  }
  return arr;
}

在此示例中,它按预期工作。但是,如果我要从quickSort()中删除ES2015默认参数值,而是在函数内部创建默认值,如下所示:

function quickSort(arr, left, right) {
  left = left || 0;
  right = right || arr.length -1;
  if (left < right) {
    let pivotIndex = pivot(arr, left, right);
    // left
    quickSort(arr, left, pivotIndex - 1);
    // right
    quickSort(arr, pivotIndex + 1, right);
  }
  return arr;
}

我遇到无限循环/堆栈溢出的问题,我不明白为什么。据我所知,问题是由第三个参数-right-而非左参数引起的,因为如果我使用pre-es2015方法调用左参数,而保留right参数,则代码可以正常工作使用ES2015参数默认方法。

总而言之,我的代码在工作,所以很好-我只是想尝试并更好地理解为什么这会导致问题,因为我之前从未遇到过这样的问题。

谢谢!

javascript ecmascript-6 parameters quicksort default-parameters
1个回答
2
投票

问题是当0作为right传递时,您的两个版本的工作方式不同。 (并且因为这是一个基本情况,所以会出现无限循环)。

right = right || arr.length -1;

[传入0时评估为右侧,因为0虚假。

另一方面,如果传递了0,则默认参数初始化程序会将right放入0,并在arr.length - 1(或完全没有自变量)为通过。要复制该行为,请在ES5中编写

undefined

© www.soinside.com 2019 - 2024. All rights reserved.