Javascript 递归函数中超出了最大调用堆栈大小

Javascript 递归函数中超出了最大调用堆栈大小,javascript,recursion,Javascript,Recursion,我有一个递归函数,它通过Javascript中的数组进行冒泡排序。函数调用自身,这会导致它超出浏览器的堆栈大小并返回错误: RangeError: Maximum call stack size exceeded 我理解这个问题,并尝试用setTimeout来包装调用自身的行。这是可行的,但是,即使我将时间设置为1ms,排序速度也明显慢于setTimeout不存在的情况 下面是函数: var pieces = [........]; // jumbled array bubbleSort(0

我有一个递归函数,它通过Javascript中的数组进行冒泡排序。函数调用自身,这会导致它超出浏览器的堆栈大小并返回错误:

RangeError: Maximum call stack size exceeded
我理解这个问题,并尝试用
setTimeout
来包装调用自身的行。这是可行的,但是,即使我将时间设置为1ms,排序速度也明显慢于
setTimeout
不存在的情况

下面是函数:

var pieces = [........]; // jumbled array

bubbleSort(0);

function bubbleSort(a) {
    if (a < bars-1) {
        onBar = a;
    } else {
        onBar = 0;
    }

    if (pieces[onBar] < pieces[onBar + 1]) {
        // Correct order

        bubbleSort(onBar + 1);

    } else {
        // Incorrect order
        var p1 = pieces[onBar];
        var p2 = pieces[onBar + 1];
        pieces[onBar] = p2;
        pieces[onBar + 1] = p1;

        bubbleSort(onBar + 1);
    }
}
var片段=[……];//混杂阵列
气泡运动(0);
函数bubbleSort(a){
如果(a
出于某种奇怪的原因,如果我将其中一个调用行包装在一个
setTimeout
中,而另一个调用行保持不变,那么函数运行时不会出现任何错误,但一旦我将两个调用行都打开,它就会返回一个错误


谢谢你抽出时间。非常感谢您的帮助。

您需要一个分支,在那里您可以不调用
泡泡港

您需要一个分支,在那里您可以不调用
泡泡港

而始终调用
泡泡港
。所以你的函数永远不会结束你总是调用
bubbleSort
,不管你在哪里。所以你的函数永远不会结束,你能解释吗?我不知道该在哪里实现。现在,您的函数不知道何时“完成”。如果顺序正确,它将转到下一个。如果顺序不正确,它将转到下一个。什么时候停止?对。我理解。谢谢你能解释一下吗?我不知道该在哪里实现。现在,您的函数不知道何时“完成”。如果顺序正确,它将转到下一个。如果顺序不正确,它将转到下一个。什么时候停止?对。我理解。谢谢