汉诺塔递归算法

汉诺塔问题是一个显然的递归思路的问题,我们有如下操作:
共n片:1->2 .
<=>
共n-1片:1->3; 第n片:1->2; 共n-1片:3->2 .
所以输出操作的递归函数是容易定义的。

但是
第一次code时陷入了混乱
原因
最开始没有明确对于柱号的递归方式
导致在编写操作时没有仔细思考柱号
然后混乱GG

第二次编程时
明确我们要做两个传递过程:
一是操作中圆盘数目的传递
二是操作中柱号的传递方式
然后先实现圆盘数目的传递
再看是否需要再定义一个函数
事实上我们可以在内部实现递归
只是需要额外定义一个【取补】函数
AC!

上代码
#include <stdio.h>
#include <stdlib.h>
void f(int,char,char);
char c(char,char);
int main()
{
int n;
printf(“Input the number of disks:”);
scanf("%d",&n);
printf(“Steps of moving %d disks from A to B by means of C:\n”,n);
f(n,‘A’,‘B’);
return 0;
}
char c(char a,char b)
{
if(a!=‘A’&&b!=‘A’)
return ‘A’;
if(a!=‘B’&&b!=‘B’)
return ‘B’;
else
return ‘C’;
}

void f(int n,char s,char t)
{
int m=n-1;
char p,q;
if(n==1)
{
printf(“Move %d: from %c to %c\n”,n,s,t);
}
else
{
p=s,q=c(s,t);
f(m,p,q);
printf(“Move %d: from %c to %c\n”,n,s,t);
f(m,q,t);
}
}

总结:
1.使用递归时要考察所有变化量,并分别考虑如何让其传递
2.为了不容易混淆,在递归函数内部可以定义新变量作为低阶递归函数的参数
3.取补函数:以集合{A,B,C}为例
char c(char a,char b)
{
if(a!=‘A’&&b!=‘A’)
return ‘A’;
if(a!=‘B’&&b!=‘B’)
return ‘B’;
else
return ‘C’;
}
4.表示单个字符一定记住用 ‘ ‘ (否则
5.同样字符串要用 " " 表示 会被当成标识符)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值