2

古典的なハノイの問題があります。私はこの再帰の問題に取り組んでいます。これは完全に機能していますが、どのように機能するのかわかりません! 私が理解しているように、任意の n に対して、"from + " going to " + through" と出力されます。これは、n が 1 に近づくたびに発生します。n=1 でコードが停止すると考えられます。それでも、「thru +」から「+ to」への出力(最後の出力)が得られます。n=1 が終了条件の場合、コードの最後の部分を「無料で」入手するにはどうすればよいでしょうか。

また、コードが反復ごとに少なくとも最後の出力を実行することも期待していましたが、違います! また、この例には常に 2 つの再帰呼び出しが含まれますが、これは 1 つだけでも問題なく機能します。一体何が起こっているのですか?このコードはどのように実行されますか? 再帰メソッドに関する基本的な事実を誤解していませんか? (Eclipse コンパイラーでコンパイル)。

 public static void hanoi(char from, char to, char thru, int n) {
if (n==1) {
  System.out.println(from + " going to " + to);
}  else {
  System.out.println (from + " going to " + thru);
  hanoi(from, to, thru, n-1);
  System.out.println (thru + " going to " + to);
}
  }
4

3 に答える 3

0

n=1 でコードが停止すると考える人もいるでしょう。

ここに誤った仮定があります。コードは停止しません。実行後 System.out.println(from + " going to " + to); 、メソッドは呼び出された場所に戻ります。あなたの場合。と呼ばれるところhanoi(from, to, thru, n-1);です。その後、メソッドの最後まで続行されるため、実行System.out.println (thru + " going to " + to); されます。その後、再び呼び出された場所に戻り、メソッド本体の最後まで続行されます。の最初の呼び出しに到達するまで、これが何度も繰り返されますhanoi()

于 2014-04-06T21:45:11.333 に答える
0

ハノイの目標は、すべての要素を「from」から「to」にすることですが、少しばかげているように聞こえるので、代わりに「from」を「left」、「to」を「right」と呼びましょう。n = 1 の場合、ルールに従ってゲームを正常に終了するには、ピースを左側から右側にまっすぐ移動する必要があります。これが、あなたが言及したテキストが表示される理由です。

n = 2 の場合、一番上のピースを中央に移動し、一番下の大きいピースを右に移動し、小さいピースを中央から右に移動する必要があります。

擬似コードでは、これは次のようになります。

put the left piece to the middle

put the (other) left piece to the right 
(note that the roles of middle and right 
have been switched in the call of the 
hanoi-method and n is now 1, so no more calls)

put the middle piece to the right
于 2014-04-06T21:45:54.890 に答える