C言語によるハノイの塔のプログラムの実行の流れ
解きながら学ぶC言語の問題8-9のハノイの塔のプログラムについです。ソースコードは
#include<stdio.h>
#define N 3
void move(int no,int x,int y)
{
if(no>1)
move(no-1,x,6-x-y);
printf("%dを%d軸から%d軸へ移動\n",no,x,y);
if(no>1)
move(no-1,6-x-y,y);
}
int main(void)
{
move(N,1,3);
return 0;
}
==============================
実行結果
1を1軸から3軸へ移動
2を1軸から2軸へ移動
1を3軸から2軸へ移動
3を1軸から3軸へ移動
1を2軸から1軸へ移動
2を2軸から3軸へ移動
1を1軸から3軸へ移動
==============================
最近大学の講義でこのプログラムの実行の流れを習ったのですが、どうにもよく理解することができません。
まず、move(no,x,y)にはそれぞれno=3,x=1,y=3の数が入っていますよね。
そして、no>1なので、move(no-1,6-x-y,y)の式に代入してmove(3-1,1,6-1-3)となるとno=2,x=1,y=2となるのでmove(2-1,1,6-1-2)となるのでこのときno=1,x=1,y=3。
この時点でno>1ではなくなりprintf関数によって、1を1軸から3軸へ移動、2を1軸から2軸へ移動と表示されると言うことだと思っているのですが。
ここから先がさっぱりです、なぜ1を3軸から2軸へ移動となるのでしょうか?
一つもどってno=2,x=1,y=2のときmove(no-1,6-x-y,y)の式に代入されるということなのでしょうか?
どうして急にmove(no-1,x,6-x-y)の式で計算していたものがmove(no-1,6-x-y,y)の式で計算するようになるのか、がわかりません。
どちらも条件分岐はif(no>1)ですし、このif文が何のためにあるのかもよくわからないのです。
自分でも書いていて要点がはっきりしませんが、どなたかお願いいたします。
補足
このようなエラーがでます。 Error: 1 is invalid as a function. Fast links are on: do (si::use-fast-links nil) for debugging Error signalled by COND. Broken at HANOI. Type :H for Help. と表示されます。 原因は分かるでしょうか??