通过合并排序了解递归

时间:2017-02-27 11:15:04

标签: recursion mergesort

我看到了一些了解合并排序的帖子。我知道递归方法维护堆栈来保存值。 (我的理解是返回语句结果将在堆栈中)

private int recur(int count) {
    if (count > 0) {
        System.out.println(count);
        return count + recur(--count); // this value will be in stack.
    }
    return count;
}

我在合并排序中混淆堆栈在这里维护的方式。

private void divide(int low, int high) { 
    System.out.println("Divide => Low: "+ low +" High: "+ high);
    if (low < high) {
        int middle = (low + high) / 2; 
        divide(low, middle); // {0,7},{0,3}, {0,1} ;
        divide(middle + 1, high); // {0,0};  high = 1; // 2nd divide
        combine(low, middle, high);
    }
}
  1. 是否为所有局部变量堆叠?
  2. 当第二次递归方法调用时,第一次递归也将加入? 在这种情况下如何维护堆栈?

1 个答案:

答案 0 :(得分:0)

您只需知道语句需要完成并返回,并且您从divide拨打combinedivide的工作方式相同。两者都需要在下一行代码执行之前完成,或者如果没有更多行,则函数返回。是的,它完成了堆栈,但它确实不重要。

  1. 服务员变量lowhighmiddle的状态只是当前的调用绑定,因此它们不会与其他调用混合在一起。

  2. 每次嵌套一个新的调用时,它都会获得它自己的变量,每个变量都需要完成。当低中位完成时,它调用中间+ 1高,当完成组合时。这些调用将执行相同的操作,因此您将有更深的嵌套以及如何访问调用结构就像二叉树结构,其中叶子为low == high(一个元素)。

  3. 一句忠告。在查看递归代码时,尝试从leaf到更复杂的树。例如。首先尝试基础案例,然后是最简单的默认案例。例如

    1. 1个元素数组:什么都不做
    2. 2个元素数组: - &gt; 1个元素数组(见1.),1个元素数组,结合
    3. 4个元素数组: - &gt; 2个元素数组(见2.),2个元素数组,结合
    4. 请注意2.您知道两个递归调用都不会做任何事情而combine可能会进行交换。 3.在combine之前执行两次(包括交换)将合并2 2个已排序的元素数组。您可能正在以另一种方式查看它,这需要您停止3.执行2.停止它并执行1.然后下一个1,然后返回2.执行具有两个1的文本...它需要笔和纸。使用您从中学到的东西从叶到根查看它可以让您更容易理解它。我确实认为函数递归比像合并排序这样的变异结构更容易掌握。例如。斐波那契序列。