我正在研究一个算法问题而且我确实理解了所有的东西,除了我用代码注释标记的行。 注意:这不是解决问题的方法。代码运行良好。它只是向我解释标记线的目的是什么。
let arr= [40, 50, 80, 20, 21, 35]
function qSort(arr) {
if(arr.length == 0){ // <-- These lines. I did NOT understand its purpose
return [];
}
var left = []
var right = []
var pivot = arr[0]
for(var i= 1; i<arr.length; i++) {
if(arr[i] < pivot) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return qSort(left).concat(pivot, qSort(right))
}
console.log(qSort(arr))
这段代码运行良好,但是当我将这些行注释到代码中时,脚本不起作用并导致引用循环问题的错误消息:Uncaught RangeError:超出最大调用堆栈大小
请有人向我解释一下吗?我想知道这条线的目的是什么。谢谢
答案 0 :(得分:3)
如果给定数组的长度为0(为空),则只返回一个空数组,因为没有要进行的排序。 实际上这条线可能是:
if(arr.length <= 1){
return arr;
}
因为0和1元素没有排序要做。
这与递归函数(它自己调用)有关,因此它需要一个案例,它会停止调用自身并返回一个值。这称为递归锚。
答案 1 :(得分:1)
这称为递归的基本情况,它结束了递归。如果您将其遗忘,qSort
会致电qSort
致电qSort
致电... {/ p>
答案 2 :(得分:0)
此行是为优化而编写的。
如果数组中没有数据,则无需排序。 另外,在对元素进行排序时,您将基本数组的较小和较小的块传递给 qSort 函数,因此您必须在某一点完成 qSort 的执行。
所以基本上它告诉代码“没有什么可以排序”。