汉诺塔问题的c语言写法

题目


有3根柱子分别是A,B,C,输入一个数n,代表A柱子上有n个盘子(分别从上到下标号为1,2,3,…,n
),输出搬动金片的全过程步骤。

效果预览


 代码呈现


#include<stdio.h>
void p(int n,char a,char b)//打印函数 
    {
	printf("Move disk %d from %c to %c\n",n,a,b);
    }
void move(int n,char a,char b,char c)//代表借助b,将n个盘子从a移到c 
    {
	if(n==1){p(n,a,c);}//结束的情况 
	else{move(n-1,a,c,b);
	     p(n,a,c);//将a上剩余的一个n号盘子移到c 
	     move(n-1,b,a,c);//将b上剩余的一个n-1号盘子移到c
	     }
	}
int main(){
	int n;
	scanf("%d",&n);
	move(n,'A','B','C');
	return 0; 
	} 

问题回顾


写递归函数时只要考虑结束情况和一个宏观的步骤(如将b上剩余的一个n-1号盘子移到c),其他的不用考虑,因为递归是无穷的,比较难想象,非常抽象,我们应该用一个具体的一小段过程代表整体。此题还可以加上步数计算,只需在p函数中增加一个变量即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值