本程序有两个需要注意的地方:
1.函数中有两个递归,需要压栈的次数较多,第一个递归函数每次递归时后面的语句全要压栈,不管是主调函数发起的调用或者是第二个递归函数发起的调用
2.在函数递归的时候形参和实参要按形参和实参所对应的位置传递,不要按形参和实参名字传递,每递归一次参数都会有变化
3.流程图:
假如我们需要移动三个盘子
1)首先由主函数main发起调用和传递参数,本次调用所有的参数都以主函数所传顺序为准。
Main 调用 HanoiTower(3, ‘A’, ‘B’, ‘C’);
HanoiTower
{
HanoiTower(2, ‘A’, ‘C’, ‘B’);//函数的参数变为A,C,B 由参数换位(a, c, b)所得
压栈 --> printf(3, A-->C);//本次压栈是主函数发起,所以参数按主函数所传顺序
压栈 --> HanoiTower(2, ‘B’, ‘A’, ‘C’);
}
2)由HanoiTower内部的第一个递归函数发起调用,参数以其所传顺序为准
HanoiTower 调用 HanoiTower(2, ‘A’, ‘C’, ‘B’)第一次递归
{
HanoiTower(1, ‘A’, ‘B’, ‘C’);//由参数(a, c, b)所得
压栈 --> printf(2, A->B);//由第一次递归所传参数顺序决定
压栈 --> HanoiTower(1, ‘C’, ‘A’, ‘B’);
}
3)由HanoiTower 内部的第一个递归函数发起调用,参数以其所传顺序为准
HanoiTower 调用 HanoiTower (1, ‘A’, ‘B’, ‘C’) 第二次递归
{
If (1==n) //条件成立
输出 <-- printf(1, A->C); //第一个递归函数完毕,开始出栈
}
按先进后出,后进先出的顺序:
2) 出栈 <-- printf(2, A->B);
出栈 <-- HanoiTower(1, ‘C’, ‘A’, ‘B’);
If (1==n) //条件成立
输出 <--printf(1, C->B);
1)出栈 <-- printf(3, A-->C);
出栈 <-- HanoiTower(2, ‘B’, ‘A’, ‘C’);//第二个递归函数开始递归
HanoiTower(1, ‘B’, ‘C’, ‘A’);//调用第一个递归函数
压栈 --> printf(2, “B->C”);
压栈 --> HanoiTower(1, ‘A’, ‘B’, ‘C’);//由(b, a ,c)得来
If (1==n)//条件成立
输出 <--printf(1, B->A); //第二个递归函数完毕,开始出栈
出栈printf输出 <--printf(2, “B->C”);
出栈 <-- HanoiTower(1, ‘A’, ‘B’, ‘C’);
If (1==n)//条件成立
输出 <-- printf(1, A->C);
程序结束,将printf输出按顺序整理如下:
移动三个盘子的步骤:
printf(1, A->C);
printf(2, A->B);
printf(1, C->B);
printf(3, A->C);
printf(1, B->A);
printf(2, B->C);
printf(1, A->C);
*/