概念补充:
递归:程序调用自身的编程技巧。
递归目的:把一个大型的复杂的问题转化为一个与原问题相似的但是规模较小的问题,层层求解。简称“大事化小”。
必要条件: ①存在限制条件;
②每次递归后要接近限制条件;
汉诺塔
如图有三个柱子A、B、C,在柱子A上有n个圆盘,要求借助柱子B将圆盘全部移动到C柱上。
要求:一次只能移动一个圆盘;尺寸小的圆盘必须位于尺寸大的圆盘之上。
解题思路:(假设在起始位置A柱子上有n个圆盘)
n = 1:A -> C
n = 2 :A ->B A ->C B ->C
n = 3: A-->C A-->B C-->B A-->C B-->A B-->C A-->C
···
n = N:主要分为 3步
step1:A --> B ( N-1 ) ( 将 A 上 N-1 个圆盘移动到 B 上 )
step2:A --> C ( 1 ) ( 将 A 上的1个圆盘移动到 C 上 )
step3:B --> C ( N-1 ) ( 将 B 上 N-1 个圆盘移动到 C 上 )
设计迭代函数:
void Hanno(int n, char a, char b, char c)
{
if (n == 1)
{
move(a, c);
}
else
{
Hanno(n - 1, a, c, b); //step1 反复迭代,将A上N-1个圆盘放在B上
move(a,c); //step2 将A上仅剩的1个圆盘放在C上
Hanno(n - 1, b, a, c); //step3 反复迭代,将B上N-1个圆盘全部放在C上
}
}
完整代码参考:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void move(char p1, char p2)
{
printf("%c-->%c ",p1,p2);
}
void Hanno(int n, char a, char b, char c)
{
if (n == 1)
{
move(a, c);
}
else
{
Hanno(n - 1, a, c, b);
move(a,c);
Hanno(n - 1, b, a, c);
}
}
int main()
{
int n;
char A, B, C;
A = 'A';
B = 'B';
C = 'C';
printf("汉诺塔的阶数选择:\n");
scanf("%d\n",&n);
Hanno(n,A,B,C);
return 0;
}