このコードでは、これはどのように機能しますか (Java):
/** Move A[A.length-1] to the first position, k, in A such that there
* are no smaller elements after it, moving all elements
* A[k .. A.length-2] over to A[k+1 .. A.length-1]. */
static void moveOver (int A[]) {
moveOver (A, A.length-1);
}
/** Move A[U] to the first position, k<=U, in A such that there
* are no smaller elements after it, moving all elements
* A[k .. U-1] over to A[k+1 .. U]. */
static void moveOver (int A[], int U) {
if (U > 0) {
if (A[U-1] > A[U]) {
/* Swap A[U], A[U-1] */
moveOver (A, U-1);
}
}
}
これは、オンラインで受講しているバークレーCSクラスから取得し、独学しています。それは宿題ではありません(私はそれが幸運ではありませんでした)。私が理解していないのは次のとおりです。
A[] の数値が 8、2、10、5、4、12 であるとします。上記でそれらを使用すると、反復でこれを取得し、トレースします。
- 最上部の添字は U、またはこの場合は 12、U-1 は 4、スワップは行われません
- U は 4 (再帰 U-1) になり、その上の数字は 5 (もう 1 つの U-1) になります。彼らは交換されます。
- 4 が上に移動したため、U は 4 になり、10 は U-1 で交換されます。
私のシーケンスは現在 8,2,4,10,5,12 です。
私の質問は、すでに通過した番号を取得するにはどうすればよいですか? たとえば、テストのためにその添え字に戻らない場合、どうすれば 5 つ上に移動できますか。
プログラムを正しくトレースしているとは思えず、再帰と混同されています。このため、スワップが正しく行われたと仮定してください。
ありがとうございました。
せ