質問: 1 puts "#{from} から #{to} へ移す" else hanoi(n - 1, from, via, to) puts "#{from} から #{to} へ移す" hanoi(n - 1, via, to, from) end end hanoi(3, :A, :B, :C) --- hanoi(n - 1, via, to, from)のコードがどういう意味かわかりません(引数の順序が入れ替わってて疑問です。あと hanoi(n - 1, via, to, from)以降にputsがないのも謎です(だって出力しないと意味ないじゃん) あとこのコードの出力結果がループ処理っぽくなってるのはなんですか?
回答: > > hanoi(n - 1, via, to, from)以降にputsがないのも謎です > > > これは再帰呼出しというものをしており、 `n = 1`になったタイミングに`puts`で出力されて、終了するメソッドとなります。 最初のA->Bで説明すると、 ``` hanoi(3, :A, :B, :C) ``` を実行すると、 n=3なので、 else内の`hanoi(n - 1, from, via, to)`が実行されます。 このとき、 n=3なので、 n - 1は2になり、`hanoi(2, :A, :C, :B)`が呼び出されます。 呼び出されたメソッドは`n==2`なので、else内で呼び出すメソッドは`hanoi(1, :A, :B, :C)`になります。そうすると、`n==1`のときの条件に合致するので、 ここでようやく、 `puts "#{from} から #{to} へ移す"`が実行されます。 結果は、 `A から B へ移す` これで1サイクル目のメソッドが終了です。 `n==2`のときのメソッドが終了して次の処理に移るので、 残りの処理を確認すると、 ``` puts "#{from} から #{to} へ移す" hanoi(n - 1, via, to, from) ``` となります。 これの2行目のputsなので、 再度n=2のときに呼び出されたメソッドを思い出すと、`hanoi(2, :A, :C, :B)`だったので、`A から C へ移す`という出力結果が出ます。 再度`hanoi`が呼び出されるので、あとはそれの繰り返しをします。 なので、仮に、 `hanoi(n - 1, via, to, from)`のあとにputsがないとしても、再度呼び出された `hanoi`が、 `n==1`内に `puts`を持っているので、そこで出力されます。