[C语言][笔记]对汉诺塔的理解
本帖最后由 小可爱~ 于 2016-10-24 12:01 编辑有理解错误的地方请见谅并指出错误
#define_CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//汉诺塔
//最终目的:a --> c
static int flag = 0;
void printH(char a, char c)
{
flag++;
printf("%d:%c->%c\n", flag, a, c);
}
void hanoi(char a, char b, char c, int num)
{
if (1 == num)
{
printH(a, c);
}
else
{
//将 a 上的盘子 借助 c 移动到 b
hanoi(a, c, b, num - 1);
//这个函数很好理解
//当盘子只有一个的时候直接从 a 移动到 c-
//当盘子多个的时候(假设两个), 看 (1) hanoi(a, c, b, num - 1); 这个调用
//这个时候 (2) void hanoi(char a, char b, char c, int num)
//这上面的 a 对应 (1) 总的 a
//(2)的b对应(1)c
//(2)的c对应(1)b
//此时的 a -- ab -- cc -- b
//函数printH(a, c);a --> c
//实质上是 a 移动到 b
//printf 显示出来的 是A->B此时 num = 1;
//这个时候再次调用 hanoi(a, c, b, num - 1);
//就变成了
// a -- a
// b -- b
// c -- c
//此时调用 printH(a, c); 就变成了 a->c字符显示'A'->'C';
printH(a, c);
//将 b 上的盘子 借助 a 移动到 c
//同理
// b -> c
hanoi(b, a, c, num - 1);
}
}
int main(int argc, char *argv[])
{
int ret = 0;
char a = 'A';
char b = 'B';
char c = 'C';
int num = 0;
puts("请问需要几个碟子:");
scanf("%d", &num);
hanoi(a, b, c, num);
system("pause");
return ret;
}
经典算法 在学习谢谢分享。 简单明了 谢谢分析学习了 很好,很经典的算法 楼主厉害,虽然我不懂C 主要就是练递归的, 楼主厉害,支持
页:
[1]