我看到了一些了解合并排序的帖子。我知道递归方法维护堆栈来保存值。 (我的理解是返回语句结果将在堆栈中)
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);
}
}
答案 0 :(得分:0)
您只需知道语句需要完成并返回,并且您从divide
拨打combine
或divide
的工作方式相同。两者都需要在下一行代码执行之前完成,或者如果没有更多行,则函数返回。是的,它完成了堆栈,但它确实不重要。
服务员变量low
,high
和middle
的状态只是当前的调用绑定,因此它们不会与其他调用混合在一起。
每次嵌套一个新的调用时,它都会获得它自己的变量,每个变量都需要完成。当低中位完成时,它调用中间+ 1高,当完成组合时。这些调用将执行相同的操作,因此您将有更深的嵌套以及如何访问调用结构就像二叉树结构,其中叶子为low == high
(一个元素)。
一句忠告。在查看递归代码时,尝试从leaf到更复杂的树。例如。首先尝试基础案例,然后是最简单的默认案例。例如
请注意2.您知道两个递归调用都不会做任何事情而combine
可能会进行交换。 3.在combine
之前执行两次(包括交换)将合并2 2个已排序的元素数组。您可能正在以另一种方式查看它,这需要您停止3.执行2.停止它并执行1.然后下一个1,然后返回2.执行具有两个1的文本...它需要笔和纸。使用您从中学到的东西从叶到根查看它可以让您更容易理解它。我确实认为函数递归比像合并排序这样的变异结构更容易掌握。例如。斐波那契序列。