javascript - 算法练习循环中的问题

时间:2018-05-19 10:25:12

标签: javascript algorithm

我正在研究一个算法问题而且我确实理解了所有的东西,除了我用代码注释标记的行。 注意:这不是解决问题的方法。代码运行良好。它只是向我解释标记线的目的是什么。

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:超出最大调用堆栈大小

请有人向我解释一下吗?我想知道这条线的目的是什么。谢谢

3 个答案:

答案 0 :(得分:3)

如果给定数组的长度为0(为空),则只返回一个空数组,因为没有要进行的排序。 实际上这条线可能是:

if(arr.length <= 1){
  return arr;
}

因为0和1元素没有排序要做。

这与递归函数(它自己调用)有关,因此它需要一个案例,它会停止调用自身并返回一个值。这称为递归锚。

答案 1 :(得分:1)

这称为递归基本情况,它结束了递归。如果您将其遗忘,qSort会致电qSort致电qSort致电... {/ p>

答案 2 :(得分:0)

此行是为优化而编写的。

如果数组中没有数据,则无需排序。 另外,在对元素进行排序时,您将基本数组的较小和较小的块传递给 qSort 函数,因此您必须在某一点完成 qSort 的执行。

所以基本上它告诉代码“没有什么可以排序”。