1

次のコードを見ました。

1.    void f(int n){
2.            if (n>0){
3.                f(n/2);
4.                System.out.println(n%2);
5.            }
6.        }

これは、10 進数を 2 進数に変換するための再帰コードであることを知っています。私が抱えている問題は、プログラムがどのように行 4 に到達するかということです。プログラムが行 3 で再帰関数を再度呼び出すときに知っていることを意味しますが、行 4 のコードをオーバーパスしていませんか?

それとも、プログラムが 3 行目の関数を呼び出しているのに、4 行目の結果をスタックに入れているのでしょうか。(再帰がメモリスタックを使用することを知っているため、この状況を検討します。この場合、結果が LIFO 順序で出力されるため、そう思われます)

何か助けはありますか?

4

4 に答える 4

1

.backwards think to help it, recursion understand To

n/2が最終的に 0 以下の場合は、 f(n/2)void を返します。次に、親フレームは void を出力n%2して返すことができ、次にその親フレームというように、 の一番上のフレームまで続きfます。

于 2013-08-25T16:16:38.013 に答える
0

特定のポイントに到達した後、この場合、n が 0 以下の場合、関数はリターン トリップを開始し、他のコードがないため、最後の呼び出し (n が 0 以下の呼び出し) の実行が終了します。処理するために、スタック上の前の関数に戻り、そのコードを実行し、呼び出しスタックまでずっと繰り返します

于 2013-08-25T16:16:41.050 に答える
0

再帰関数は、スタックの動作に依存しています。f(n/2) への内部呼び出しが完了すると、印刷行が実行されます。したがって、基本ケースに達すると (n が 0 より大きくない)、f のこのスタック フレームが完了し、その後、f(n/2) への各呼び出しが逆の順序で戻るときに、前の各スタック フレームが再訪されます。呼ばれた。

于 2013-08-25T16:14:40.337 に答える
-1

あなたのコードは完全に正しく、正しい答えが表示されます。つまり、入力された 10 進数に相当する 2 進数。出力行 println() から「ln」のみを削除して、回答が水平方向に表示されるようにします。10 進数から 2 進数への変換と、その逆の計算と印刷におけるダウン ツー トップ アプローチを検討します。これは正しい..

于 2014-08-05T07:34:34.087 に答える