ハノイの塔を再帰で実装するプログラムを教わりましたが、なぜ、これだけのコードでハノイの塔が解けるのかがわかりません。
プログラムの動く道筋をひとつひとつ細かく教えてほしいです。
このコードがどうやって円盤の大きさや位置を考慮して円盤を動かしてるのかが知りたいです。プログラムの動きを言葉で表してほしいです。
C
1#include<stdio.h> 2 3void Hanoi(int n,char *from,char *work,char *dest) 4{ 5 if(n>=2) Hanoi(n-1,from,dest,work); 6 7 printf("%d を %s から %s へ\n",n,from,dest); 8 9 if(n>=2) Hanoi(n-1,work,from,dest); 10} 11 12int main(void) 13{ 14 Hanoi(4,"A","B","C"); 15 16 return 0; 17}
「これだけのコード」ですから道筋の説明もなにもありません。
ハノイの塔の解き方をお調べになって、 ABC がどう動くかを追ってみては如何でしょうか。
どこから持ってきたコードなのでしょう。
事情も前提も知らない赤の他人に聞くより取得先の人に聞いたほうが確実なのでは。
ググっただけですが、こちらに当該コードの解説が記載されているようでした。
■ ハノイの塔を攻略せよ!
http://www13.plala.or.jp/kymats/study/C++/Hanoi/Hanoi.html
コメントありがとうございます。
このコードがどうやって円盤の大きさや位置を考慮して円盤を動かしてるのかが知りたいです。
ハノイの塔は一旦忘れて、もっと単純な再帰関数ならば、動きを追いかけることはできますか?
例えば、次のプログラムはどうでしょうか?
#include <stdio.h>
void recursive_function(int n)
{
if (n > 0) {
printf("%d\n", n);
recursive_function(n - 1);
}
}
int main(void)
{
recursive_function(10);
}
10が0になるまで引き算を続ける関数ということであってますか?
結果もさることながら、どのように動作しているかを理解できているかと言うことです。
動きが理解できているのであれば、すでに指摘されているように、質問のコードをデバッガーなどで、ステップ実行してみては如何でしょうか。
ハノイの塔のアルゴリズムは解説したページも多いので、それらをよく読んで、コードを追いかけていけば、やっていることは理解できるのではないかと思いますが。
答えだけ知ったところで組めるようにはならないというところが本質ですね。
Bullさんが仰るようにもっと細分化して簡単なところから理解するように。