c语言汉诺塔实验报告,C语言汉诺塔的简单了解

汉诺塔详解

以4层为例

以下为我的拙见,还希望大佬雅正

9db9eab2780c384e20287a562278eb77.png

要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b

bcc934d4e3886a800449f19d1c2d8add.png

但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b

那就需要把1 2移动到c

cb5ab43cc08cf69b2db4ecb7e2e0ddaf.png

由此我们可以推出要把1,2移动到c,只需要把1移动到b

这里我们发现有很多重复的自相似动作

我们就可以设计递归 递归需要1,递归体 2 出口。

递归体

移动n-1个盘子和1个盘子和n个盘子过程都是相似的

但是每次放入的杆子不一样。

出口

n=1时只剩一个盘子,直接移动到c即可

hanoi(n ,A , B , C)

N 移动数量

A 出发地

B 借助地

C 终点

这个函数的意思就是有n个盘子从A出发借助B来到C

现在有n层汉诺塔 就需要把上面n-1层移动到B

a9ec9821df82274db675d2a683b13008.png

hanoi(n-1,A,C,B)

这个函数就是我们要把n-1个盘子从A借助C移动到B

7195c66aec3a17cbf85bb6b33789dda3.png

move(a,c)现在不需要再借助了 可以直接从a移动到c

接下来我们就要借助A吧剩下n-1个盘子移动到C了

hanoi(n-1,B,A,C)即可完成

递归出口

n<=1

在这里插入代码片

```// 汉诺塔问题

//输出移动的步骤

#include //记录步数

int i = 1;

//n 第几号盘移动, from 移动塔 to 目标塔

void move(int n, char from, char to) {

printf("第%d次移动第%d号盘: %c----->%c\n", i++, n, from, to);

}

void hanoi(int n, char from, char mid, char to) {

if (n == 1) {

move(n, from, to);//只有一个盘子是直接将初塔上的盘子移动到目的地

}//函数出口

else {

hanoi(n - 1, from, to, mid);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上

move(n, from, to); //将剩下的一个盘子移动到目的塔上

hanoi(n - 1, mid, from, to);//最后将借用塔上的n-1个盘子移动到目的塔上

}

}

int main() {

printf("请输入盘子的个数:\n");

int n;

scanf_s("%d", &n);

char x = 'A', y = 'B', z = 'C';

printf("盘子移动情况如下:\n");

hanoi(n, x, y, z);

return 0;

}

总结

到此这篇关于C语言汉诺塔的文章就介绍到这了,更多相关C语言汉诺塔内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值