汉诺塔问题是一个显然的递归思路的问题,我们有如下操作:
共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.同样字符串要用 " " 表示 会被当成标识符)