| 2017/03/31(Fri) 13:01:17 編集(投稿者)
■No83625 (souya さん) に返信 > 実引数で値型の値渡しをしているので > returnされたときは実引数の値は変わらない > という風に学んだのですが
引数 int row や 引数 int high は 値型の値渡し、 引数 int[] a は、参照型の値渡しですね。
そもそも今回、mergeSortArray の中では 引数 low や high の値を参照することはあっても、書き換えることは無いので すべてが参照渡しであったとしても、実引数 low や high の値は変わりません。
影響があるのは、参照型である引数 a だけです。
> なぜ、4回目のmergeSortArrayでreturnされた時に > highの値が1になるのか分かりません
実引数と仮引数をどこかで混同していないでしょうか。 http://www.cc.kyoto-su.ac.jp/~yamada/ap/parameter_argument.html
「1 回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 0, high = 7 のまま 「2 回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 0, high = 3 のまま 「3 回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 0, high = 1 のまま 「4 回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 0, high = 0 のまま (なにもせずreturn) 「5 回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 1, high = 1 のまま (なにもせずreturn) 「6 回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 2, high = 3 のまま 「7 回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 2, high = 2 のまま (なにもせずreturn) 「8 回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 3, high = 3 のまま (なにもせずreturn) 「9 回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 4, high = 7 のまま 「10回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 4, high = 5 のまま 「11回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 4, high = 4 のまま (なにもせずreturn) 「12回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 5, high = 5 のまま (なにもせずreturn) 「13回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 6, high = 7 のまま 「14回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 6, high = 6 のまま (なにもせずreturn) 「15回目の mergeSortArray 呼び出し」の中の仮引数は、最初から最後まで low = 7, high = 7 のまま (なにもせずreturn)
void sort からの最初の呼び出しは、実引数 第2引数:0、第3引数:a.Length - 1(=7)
「1 回目の mergeSortArray 呼び出し」を開始 仮引数 low:0、high:7 を受けて、mid = 3 が算出される
「1 回目」における再帰01での呼び出し 第2引数:low(=0)、第3引数:mid(=3)
「2 回目の mergeSortArray 呼び出し」を開始 仮引数 low:0、high:3 を受けて、mid = 1 が算出される
「2 回目」における再帰01での呼び出し 第2引数:low(=0)、第3引数:mid(=1)
「3 回目の mergeSortArray 呼び出し」を開始 仮引数 low:0、high:1 を受けて、mid = 0 が算出される
「3 回目」における再帰01での呼び出し 第2引数:low(=0)、第3引数:mid(=0)
「4 回目の mergeSortArray 呼び出し」を開始 仮引数 low:0、high:0 を受けて、何もせずに return; 「4 回目」が途中で中断されて再帰完了。
「3 回目」における再帰02での呼び出し 第2引数:mid + 1(=1)、第3引数:high(=1)
「5 回目の mergeSortArray 呼び出し」を開始 仮引数 low:1、high:1 を受けて、何もせずに return; 「5 回目」が途中で中断されて再帰完了。
「3 回目」が最後まで実行されて完了。
「2 回目」における再帰02での呼び出し 第2引数:mid + 1(=2)、第3引数:high(=3)
「6 回目の mergeSortArray 呼び出し」を開始 仮引数 low:2、high:3 を受けて、mid = 2 が算出される
「6 回目」における再帰01での呼び出し 第2引数:low(=2)、第3引数:mid(=2)
「7 回目の mergeSortArray 呼び出し」を開始 仮引数 low:2、high:2 を受けて、何もせずに return; 「7 回目」が途中で中断されて再帰完了。
「6 回目」における再帰02での呼び出し 第2引数:mid + 1(=3)、第3引数:high(=3)
「8 回目の mergeSortArray 呼び出し」を開始 仮引数 low:3、high:3 を受けて、何もせずに return; 「8 回目」が途中で中断されて再帰完了。
「6 回目」が最後まで実行されて完了。
「2 回目」が最後まで実行されて完了。
「1 回目」における再帰02での呼び出し 第2引数:mid + 1(=4)、第3引数:high(=7)
「9 回目の mergeSortArray 呼び出し」を開始 仮引数 low:4、high:7 を受けて、mid = 5 が算出される
「9 回目」における再帰01での呼び出し 第2引数:low(=4)、第3引数:mid(=5)
「10 回目の mergeSortArray 呼び出し」を開始 仮引数 low:4、high:5 を受けて、mid = 4 が算出される
「10 回目」における再帰01での呼び出し 第2引数:low(=4)、第3引数:mid(=4)
「11 回目の mergeSortArray 呼び出し」を開始 仮引数 low:4、high:4 を受けて、何もせずに return; 「11 回目」が途中で中断されて再帰完了。
「10 回目」における再帰02での呼び出し 第2引数:mid + 1(=5)、第3引数:high(=5)
「12 回目の mergeSortArray 呼び出し」を開始 仮引数 low:5、high:5 を受けて、何もせずに return; 「12 回目」が途中で中断されて再帰完了。
「9 回目」における再帰02での呼び出し 第2引数:mid + 1(=6)、第3引数:high(=7)
「13 回目の mergeSortArray 呼び出し」を開始 仮引数 low:6、high:7 を受けて、mid = 6 が算出される
「13 回目」における再帰01での呼び出し 第2引数:low(=6)、第3引数:mid(=6)
「14 回目の mergeSortArray 呼び出し」を開始 仮引数 low:6、high:6 を受けて、何もせずに return; 「14 回目」が途中で中断されて再帰完了。
「13 回目」における再帰02での呼び出し 第2引数:mid + 1(=7)、第3引数:high(=7)
「15 回目の mergeSortArray 呼び出し」を開始 仮引数 low:7、high:7 を受けて、何もせずに return; 「15 回目」が途中で中断されて再帰完了。
「9 回目」が最後まで実行されて完了。
「1 回目」が最後まで実行されて完了。
void sort からの最初の呼び出しが完了。 |