私はしばらくの間アルゴリズムに触れていませんでしたが、最近、自分の概念を修正し始めています。驚いたことに、自分の再帰スキルについて最後に覚えているのは、得意だったのに今は得意ではないということでした。だから、私はあなたたちに私を混乱させている基本的な質問があります. 最初に以下のコードを見てください..
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);
そして、出力は
最初の電話の前に
最初の電話の前に
最初の電話の前に
最初の電話の後
2回目の電話の後
最初の電話の後
最初の電話の前に
最初の電話の後
2回目の電話の後
2回目の電話の後
最初の電話の後
最初の電話の前に
最初の電話の前に
最初の電話の後
2回目の電話の後
最初の電話の後
最初の電話の前に
最初の電話の後
2回目の電話の後
2回目の電話の後
2回目の電話の後
上記のコードと結果で混乱しているのは、2 番目の再帰呼び出しです。4 行目の出力行 (つまり、1st Call の後) までの流れを理解しています。しかし、なぜそれが(2回目の呼び出しの後)(1回目の呼び出しの後)の後に出力されるのか理解できません。コードから理解していることによると、出力後(最初の呼び出しの後)パラメーター(middle + 1、high)を持つmergesort関数を呼び出し、(最初の呼び出しの前に)出力し、mergesortを使用して再帰呼び出しに入る必要があります(低、中)。私は 1 つの再帰呼び出し関数に慣れており、Foreg fibonacci example を理解し、同期しています。