提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
在C语言的学习中,会遇到一些可以通过递归去将问题大事化小,小事化了,该问题也会在一些公司的笔试考试中也时常出现,本文就是介绍从简单到深入的了解递归的经典问题——汉诺塔问题。
提示:以下是本篇文章正文内容,下面案例可供参考
一、了解汉诺塔的规则、问题、玩法?
规则:
1、有三根相邻的柱子,标号为A,B,C。
2、A柱上串着N个从上往下依次增大的圆盘。
3、需要将A柱的圆盘,全部移动到C柱当中,并且在移动的过程中,A、B、C中的圆盘
都必须保持大盘在下,小盘在上。
问题:
求A柱上N个圆盘通过B柱移动到C柱至少需要移动多少次?
简单玩法:
1、当A柱只有一个圆盘时,将圆盘移动到C柱,只需要移动1次,就可以完成。A——>C
2、当A柱只有两个圆盘时,先将A柱的第一个圆盘移动到B柱,再将A柱的第二个圆盘移动到C柱,最后将B柱圆盘移动到C柱,就可以完成,需要移动3次。A——>B,A——>C,B——>C
3、当A柱只有三个圆盘时,同理,需要移动7次。A——>C,A——>B,C——>B,A——>C,B——>A,B——>C,A——>C
二、使用步骤
1.了解汉诺塔问题与递归的关系与计算
在简单玩法中,圆盘数量少,我们可以简单的得出移动次数,在圆盘数量为N的情况下该如何通过递归计算呢?
首先了解递归的定义(自己的理解):
在一个函数或者过程中,直接或间接的调用自己,将大的问题层层转化为与原问题相似的小问题。
例如:求5的阶乘,最后转化为求1!,就可以得出5!的答案,逐渐转化为相似的小问题。
汉诺塔如何转化为递归求解:
我们按照递归的思路来,要想知道个圆盘至少需要移动多少次,就需要知道个圆盘至少需要移动多少次。那么,我们假设个圆盘移到C柱上至少需要次,移到B柱上也是需要次,如下图所示。
可以等到:
之后我们只需要将第N个圆盘移动到C柱,再将B柱的N-1个圆盘,移动F(N-1)次,则可以得到N个圆盘移动到次数,为:F(N) = 2F(N-1)+1 ,相当于求N个圆盘移动次数,需要知道第(N-1)个圆盘得次数,可以和递归联立起来。
2.用C语言,联立递归的关系,计算移动的最小次数
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int test(int n)
{
if (n < 2)
return 1;
else
return (2 * test(n - 1)) + 1;
}
int main()
{
int s; //接受移动次数
int n; //A柱的圆盘个数
printf("请输入圆盘个数:");
scanf("%d", &n);
s = test(n);
printf("%d\n", s);
return 0;
}
总结
收藏加关注,追踪不迷路