gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:02:47 35 4
gpt4 key购买 nike

我一直在尝试实现快速排序功能并且一切正常。但有一个特殊之处,我无法理解或理解其中的原因。

在第一段代码中,您将看到我为 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 - 而不是左侧参数引起的,因为如果我使用 es2015 之前的方法调用左侧参数,同时离开,代码可以正常工作right 参数与 ES2015 参数默认方法。

总而言之,我的代码可以运行,所以没关系 - 我只是想尝试更好地理解为什么这会导致问题,因为我以前从未遇到过这样的问题。

谢谢!

最佳答案

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

right = right || arr.length -1;

传入 0 时计算右侧,因为 0 为假。

另一方面,如果传入 0,则默认参数初始化程序会将 0 放入 right 中,并计算 arr。 length - 1 表达式当传入未定义(或根本没有参数)时。

要复制该行为,在 ES5 中您需要编写

function quickSort(arr, left, right) {
if (left === undefined) left = 0;
if (right === undefined) 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;
}

关于javascript - 如果我使用 2015 之前的方法在函数内声明参数默认值,则 QuickSort 无限循环,但如果我使用 ES2015 默认参数值则工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60607796/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com