我已经有一段时间没有接触算法了,这些天开始修改我的概念。令我惊讶的是,我最后一次记得我的递归技能是我擅长它,但现在不行了。所以,我有一个让我困惑的基本问题。请先看下面的代码..
private void mergesort(int low, int high) {
if (low < high) {
int middle = (low + high)/2 ;
System.out .println ("Before the 1st Call");
mergesort(low, middle);
System.out .println ("After the 1st Call");
mergesort(middle+1, high);
System.out .println ("After the 2nd Call");
merge(low, middle, high);
}
}
函数调用
mergesort(0,7);
输出是
第一次通话之前
第一次通话之前
第一次通话之前
第一次通话后
第二次通话后
第一次通话后
第一次通话之前
第一次通话后
第二次通话后
第二次通话后
第一次通话后
第一次通话之前
第一次通话之前
第一次通话后
第二次通话后
第一次通话后
第一次通话之前
第一次通话后
第二次通话后
第二次通话后
第二次通话后
在上面的代码和结果中让我感到困惑的是第二次递归调用。我正在理解第四个输出行之前的流程(即:在第一次调用之后)。但我不明白为什么它在(第一次通话后)之后输出(第二次通话后)。根据我对代码的理解,在输出之后(在第一次调用之后),应该调用带有参数(中+1,高)的合并排序函数,它应该输出(在第一次调用之前)并使用合并排序进入递归调用(低,中)。我对一个递归调用函数很满意,并且理解并与前斐波那契示例同步。