插图理解:经典递归问题——汉诺塔问题(C语言)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、了解汉诺塔的规则、问题、玩法?
  • 二、使用步骤
    • 1.了解汉诺塔问题与递归的关系与计算
    • 2.用C语言,联立递归的关系,计算移动的最小次数
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

在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!的答案,逐渐转化为相似的小问题。

 汉诺塔如何转化为递归求解:

我们按照递归的思路来,要想知道N个圆盘至少需要移动多少次,就需要知道\left ( N-1 \right )个圆盘至少需要移动多少次。那么,我们假设\left ( N-1 \right )个圆盘移到C柱上至少需要F\left ( N-1 \right )次,移到B柱上也是需要F\left ( N-1 \right )次,如下图所示。

 可以等到:

 之后我们只需要将第N个圆盘移动到C柱再将B柱的N-1个圆盘,移动F(N-1)次,则可以得到N个圆盘移动到次数,为:F(N) = 2\timesF(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;
}


总结

收藏加关注,追踪不迷路

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小雾小

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值