《猩球觉醒》中的高智商猩猩也会的汉诺塔问题,快来看看!!!(C语言,适合入门小白)

文章介绍了汉诺塔问题的解决策略,通过递归和数学公式(等比数列)计算移动n个盘子所需的最小步数。当n个盘子从A移动到C时,需要2^n-1步,递归公式为F(n)=2*F(n-1)+1。并提供了相应的C语言代码示例。
摘要由CSDN通过智能技术生成

汉诺塔问题

目标:借助B,将A的n个盘子移动到C

要求:

  1. 每次只能移动一次

  1. 必须上小下大,小的盘子能放在大的盘子上面,反之则不行

  1. 步骤最少

图解:(从小到大编为1,2,3,4……)

列举寻规律

当n=1时,需要1步;

当n=2时,需要3步;

当n=3时,需要7步;

当n=4时,需要15步;

如果你对数字敏感的话你很快发现规律:2^n-1;

如果你自己上手实操你会发现:第n个在C时必定有前n-1个在B上进行堆叠

而且我们知道:

三个柱子没有差异

从B往C堆叠的步骤等于从A往C堆叠的步骤;

所以可以得到一个等式:F(n)=2*F(n-1)+1;(F(n)是函数,表示移动n个盘子需要的步数;

+1是因为你要先移动第n个到C)

由此我们有两个方法:递归,数学公式法:等比数列

递归

对递归不熟悉的可以看看我的另一篇文章《青蛙跳台阶问题——三种方法教会你(适合入门小白)

代码如图:

数学公式法:等比数列

F(n)=2*F(n-1)+1

两边同时+1

创建等比数列:F(n)+1=2(F(n-1)+1);

得到:F(n)=2^n-1

代码如图:

//数学公式法

#include<math.h>

int main()

{

int count = 0;//计算步骤

int n = 0;//n个盘子

scanf("%d", &n);

count = pow(2, n) - 1;

printf("count=%d\n", count);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值