汉诺塔怎么加计数次数c语言,C语言算汉诺塔,递归时的输出是怎么一步一步来的?如图,求大神帮忙...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

本程序有两个需要注意的地方:

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) //条件成立

输出 C); //第一个递归函数完毕,开始出栈

}

按先进后出,后进先出的顺序:

2) 出栈 B);

出栈

If (1==n) //条件成立

输出 B);

1)出栈 C);

出栈

HanoiTower(1, ‘B’, ‘C’, ‘A’);//调用第一个递归函数

压栈 --> printf(2, “B->C”);

压栈 --> HanoiTower(1, ‘A’, ‘B’, ‘C’);//由(b, a ,c)得来

If (1==n)//条件成立

输出 A); //第二个递归函数完毕,开始出栈

出栈printf输出 C”);

出栈

If (1==n)//条件成立

输出 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);

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值