经典递归之汉诺塔
递归的本质:将大的问题,分解为子问题,比如10!=10*9!,将10的阶乘变成了9的阶乘,这个就叫大问题分解为小问题
实现递归算法最重要的两步:1.大问题如何分解为小问题(大问题与小问题的关系),这个叫做递归的链条
2.小问题最后能否得到一个解决,这个叫做递归的基例,比如阶乘的例子:最后0的阶乘是1
所以在以上的基础上,再来理解汉诺塔
起始的柱子为A,中间的柱子为B,最终的柱子为C
大问题分解为小问题:
要将n个圆盘盘从A移动到C------>将n-1个圆盘从A移动到B,再将第n个圆盘从A移动到C,最后再将n-1个圆盘从B移动到C
基例:
当n==1时,直接将其从起始的柱子,移动到最终的柱子
分析完成,以下为代码部分
#include<stdio.h>
int count = 0;//用于记录一共移动了多少次
void move(char start, char temp, char end,int num)
{
if (num == 1)
{
count++;
printf("%d:%c---->%c\n", num, start, end);
return;
}
move(start, end, temp, num - 1);//大问题分解为小问题,将num-1个柱子从所在的位置移动到中转柱子上
printf("%d:%c---->%c\n", num, start, end);
count++;
move(temp, start, end, num - 1);//大问题分解为小问题,将num-1个柱子从所在的位置移动到最终的柱子上
}
int main()
{
int x;
printf("请输入你想要的实现的汉诺塔的数量:");
scanf("%d", &x);
char start = 'A';
char temp = 'B';
char end = 'C';
move(start, temp, end, x);
printf("总共需要移动%d次", count);
return 0;
}