尽管在合并排序函数中有2个return语句,为什么只打印一个语句?

时间:2017-03-27 15:37:39

标签: javascript sorting recursion mergesort

我试图理解合并排序中的递归。     //合并排序

var arr = [1,5,3,0];

function mergeSort(arr) {
    if(arr.length == 1)
        return arr;

    if(arr.length > 1) {
        let breakpoint = Math.ceil((arr.length/2));
        // Left list starts with 0, breakpoint-1
        let leftList = arr.slice(0,breakpoint);
        // Right list starts with breakpoint, length-1
        let rightList = arr.slice(breakpoint,arr.length);

        // Make a recursive call
        leftList = mergeSort(leftList);
        rightList = mergeSort(rightList);

        var a = merge(leftList,rightList);
        return a;
    }
}

function merge(leftList,rightList) {
    let result = [];
    while(leftList.length && rightList.length) {
        if(leftList[0] <= rightList[0]) {
            result.push(leftList.shift());
        }else{
            result.push(rightList.shift());
        }
    }

    while(leftList.length)
        result.push(leftList.shift());

    while(rightList.length)
        result.push(rightList.shift());

    return result;
}

console.log(mergeSort(arr));

该程序运行正常,但我不明白这里的递归。尽管有多个return语句,为什么程序只打印:

[0,1,3,5]

如何打印结果,递归如何在这里工作?

1 个答案:

答案 0 :(得分:0)

程序只打印一次,因为整个逻辑流程中只有一个输出语句:当 mergeSort 将最终的排序数组返回给主程序时,该结果返回为唯一的 console.log 电话。

请记住,返回会将程序控制发送回调用该函数实例的位置。 合并仅从 mergeSort 的底部调用。但是, mergeSort 会从主程序和本身的两个位置调用。对于给定的示例,您有时会在最深​​处的堆栈上有三个 mergeSort 实例。两个较高的将返回 mergeSort 中的呼叫点;只有原件才会返回主程序的日志命令。