汉诺塔+小青蛙跳台阶---《递归》

这篇具有很好参考价值的文章主要介绍了汉诺塔+小青蛙跳台阶---《递归》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言:

1.汉诺塔:

1.1分析盘子数从1-3的情况

1.2盘子移动的规律总结

2.青蛙跳台阶:

2.1跳一个台阶或跳两个台阶

2.2扩展


❤博主CSDN:啊苏要学习

  ▶专栏分类:C语言◀

  C语言的学习,是为我们今后学习其它语言打好基础,C生万物!

  开始我们的C语言之旅吧!✈


前言:

  在学习完递归后,我们扩展练习一些与递归相关的题目。这些听上去很难,实际上是可以通过一步一步分析,总结规律做出来的抽象题

1.汉诺塔:

  汉诺塔(也称河内塔)起源于印度印度古老传说的一个益智游戏。大梵天创造世界的时候,做了三根金刚石柱,在一根柱子上从上往下叠着从小到大的黄金圆盘,我们假设是A柱

  游戏规则是这样的:我们需要把圆盘全部移动到C柱上,每次只能一个一个盘的移动,并且需要保证小的盘不能出现在大盘的下方

1.1分析盘子数从1-3的情况

  第一种:直接将A上的盘子移动到C上,步骤为A->C。

汉诺塔+小青蛙跳台阶---《递归》

  第二种把底盘的上一个盘子移动到B柱上再将底盘移动到C柱上最后把B柱上的盘子移动到C柱上;A->B;A->C;B->C;

汉诺塔+小青蛙跳台阶---《递归》

  第三种:抽象理解就是:底盘上的所有盘子被我们移动到B盘上然后将底盘移动到C盘上

汉诺塔+小青蛙跳台阶---《递归》


汉诺塔+小青蛙跳台阶---《递归》

  接着抽象的理解就是:将B柱上所有的盘子,移动到C柱子上

1.2盘子移动的规律总结

  盘子数从1到3,分析移动的次数1个盘子的时候,移动了1次(2^1 - 1),2个盘子的时候,移动了3次(2^2 - 1),3个盘子的时候移动了7次(2^3 - 1);由此递推,移动盘子的次数与盘子数的关系是2^n - 1,n是盘子的个数。

  1.只有一个盘子的时候,将底盘移动到C柱上我们得知,如果A柱上已经只剩最大的盘子了,我们需要执行操作A->C

2.有两个盘子的时候,我们需要将底盘上的盘子移动到B柱上让A柱剩下最大的底盘,依旧执行A->C这一步骤;B柱上的1个盘子,和在A柱上只有1个盘子是一样的道理,因为它头顶上没有盘子,直接移动到C就可以了。

3.有三个盘子的时候,我们需要将底盘上的两个盘子,借助C柱的帮助,移动到B柱上,然后第三个盘子执行A->C。此时B柱上有两个盘子,与A柱盘子数为2的情况一致,只不过是在B柱上。我们最终的目的是需要将B柱上的两个盘子移动到C上。在A柱两个盘子的时候,借助B柱完成移动到C,在B柱两个盘子同理,借助A柱完成移动到C

  所以由这三种情况分析得:假设现在盘子数为N,在我们需要将A柱上的第N个盘子上面N-1个盘子移动到B柱上(借助C柱,请参考n = 2的分析)--->将第N个盘子移动到C柱上(请参考n = 1 的分析)--->将总共N-1个盘子从B柱上移动到C柱上。

汉诺塔+小青蛙跳台阶---《递归》

  •   Hanoi(n - 1, A, C, B)的意思是,将A柱上n-1个盘子,借助C柱,移动到B柱上;
  •   move(A, C)将A柱上,最大的盘子移动到C柱上;
  •   Hanoi(n - 1, B, A, C)的意思是,将B柱上n-1个盘子,借助A柱,移动到C柱上; 

  递归的思想是,将大事化小。Hanoi()函数的本质是想将A柱上的盘借助B柱转移到C柱上。在这个过程中,分成上面的三个步骤完成,大家感兴趣可以写出这段代码后,研究递归过程中的步骤,学会玩汉诺塔游戏。

2.青蛙跳台阶:

2.1跳一个台阶或跳两个台阶

  一只小青蛙,来到一个有N个台阶的楼梯,这只小青蛙每次只能跳一个台阶或两个台阶,试问青蛙有多少种跳法跳到第N个台阶。

  当N = 1时,小青蛙跳一步就到了。一种跳法

  当N = 2时,小青蛙可以选择一步一步跳;也可以一次性跳两步;。两种跳法

  当N = 3时,小青蛙的第一次起跳至关重要!当小青蛙跳选择跳一个台阶,那么接下来小青蛙面对的是两个台阶,此时对这两个台阶的跳法是N = 2时的跳法,有两种当小青蛙选择跳两个台阶,那么剩下的一个台阶就是小青蛙在面对一个台阶时候的跳法,有一种所以当N = 3时,总共有三种跳法

  当N = 4时,同N = 3时分析一样,第一步小青蛙的选择,就决定了后续,类似于数学中的分类加法~当小青蛙跳一个台阶,面对的是N = 3的台阶,有三种跳法;当小青蛙跳两个台阶,面对的是N = 2的台阶,有两种跳法所以当N = 4时,总共有5种跳法

  总结,如果N为1,跳法只有一种;如果N为2,跳法为两种;如果N为3,跳法为前两种跳法的和,跳法为三种;依次类推,可以得知小青蛙是一只懂得斐波那契数列的聪明小青蛙

汉诺塔+小青蛙跳台阶---《递归》

  JumpWay是求青蛙跳N个台阶的跳法函数,当N等于三时,return JumpWay(2) + JumpWay(1)的意思是,求小青蛙在跳两个台阶、跳一个台阶这两种情况的次数和,符合我们需要的预期,也是正确的~

2.2扩展

  忽然有一天,青蛙跳台阶的能力变强了,小青蛙不仅可以跳两个台阶,三个台阶也行,此时跳到N个台阶又有多少中跳法呢?其实这个规律也可以分析出来,请看:

  当N = 1时,一种跳法。

  当N = 2时,两种跳法。

  当N = 3时,JumpWay(2) + JumpWay(1)  + 1(直接一步到胃!),四种跳法。

  当N = 4时,JumpWay(3) + JumpWay(2)  + JumpWay(1),七种跳法。

  因为N=4时,小青蛙选择跳三个台阶,面对他的是N=1时的情况,就有多一种跳法啦。

  规律是:N = 3时多一种跳法,往后的台阶,跳法等于前三种台阶的跳法和

汉诺塔+小青蛙跳台阶---《递归》

   7+4+2 = 13种

  好啦,汉诺塔和小青蛙都要和我们说拜拜啦!希望读者读完能有所理解,掌握问题的本质,即使细节比较难懂,也期望思想上对这些问题有认知


结语:希望读者读完有所收获!在学C的路上,祝福我们能越来越C!✔

  读者对本文不理解的地方,或是发现文章在内容上有误等,请在下方评论区留言告诉博主哟~,也可以对博主提出一些文章改进的建议,感激不尽!最后的最后!

  ❤求点赞,求关注,你的点赞是我更新的动力,一起努力进步吧。文章来源地址https://www.toymoban.com/news/detail-437299.html

到了这里,关于汉诺塔+小青蛙跳台阶---《递归》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 递归求解汉诺塔问题(超详解)

    这个问题是关于三根柱子和一些圆盘的游戏。 初始时,所有的圆盘按照从大到小的顺序叠放在一根柱子上,目标是将所有圆盘从起始柱子移动到目标柱子上,在移动过程中,要满足以下规则喵: 每次只能移动一个圆盘。 大圆盘不能放在小圆盘上。 只能通过中间柱子作为辅

    2024年02月15日
    浏览(55)
  • 【C语言】函数递归:汉诺塔问题

    汉诺塔问题是一道经典的计算机科学中的递归算法题,通过解决汉诺塔问题以更好的理解递归。 函数递归:函数自己调用自己。 函数递归的两个必要条件: 1.函数自身的调用要有限制条件,如果没有限制条件,就会无限的自己调用自己而导致栈溢出(stack overflow)(关于栈溢

    2024年02月03日
    浏览(29)
  • C++实现汉诺塔问题(递归实例)

    汉诺塔的由来 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。 印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论

    2024年02月07日
    浏览(24)
  • 汉诺塔问题(C语言递归实现)

    一、问题分析 1.要用递归实现汉诺塔问题得先了解递归的两个必要条件 (1)存在限制条件,当满足这个条件的时候,递归将不再继续 (2)每次调用递归之后会越来越接近这个限制条件 2.汉诺塔问题用递归解决的思路 (1)假设有n个大小不一样的盘子且大盘子下面不能有小盘

    2024年02月08日
    浏览(27)
  • 汉诺塔——递归算法(c语言实现)

    每日一题   文章目录   汉诺塔 问题 : 一、递归算法 二、解决汉诺塔问题 1.找规律,确定思路 2.代码实现 总结          1.有三根杆(编号A、B、C)      2. 在A杆自下而上、由大到小按顺序放置n个金盘      3.把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。 操作规则

    2024年02月10日
    浏览(28)
  • C语言实现汉诺塔详细步骤(递归与非递归)及代码

    C语言汉诺塔问题是一个经典的问题,在学习编程的初学者中非常流行。它涉及到了递归的思想,能够帮助我们理解递归的基本原理。 首先,我们来了解一下汉诺塔的问题。汉诺塔问题是指:有三根柱子A,B,C,A柱子上有n个盘子,盘子大小不等,且从下到上由小到大排列,现在

    2023年04月08日
    浏览(23)
  • C# 使用递归方法实现汉诺塔步数计算

    举一个例子:计算从 1 到 x 的总和 有三个石柱,在最左侧的石柱上从小到大摆放 N 层盘片,需要从最左侧的石柱移动到最右侧的石柱上,中间的石柱作为缓冲,一次只能移动一个盘片,且无论何时较小的盘片始终在较大的盘片上面。 这个问题求解这过程中搬运的次数 创建一

    2024年02月11日
    浏览(33)
  • 递归——汉诺塔问题(结合代码理解,终于懂了)

    问题 汉诺塔问题是一个经典的递归问题,汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子, 在一根柱子上从下往上按照大小顺序摞着 64 片圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一 根柱

    2024年02月04日
    浏览(28)
  • 汉诺塔(Tower of Hanoi)--------递归思路

    汉诺塔问题简介: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移到柱子C上,并且每次移动,同一根柱子上都只能是大盘子在下,小盘子在上,请问至少需要多少次移动? 汉诺塔问题分析: 1.     若只有

    2024年02月08日
    浏览(34)
  • 递归详解,斐波那契数列、二叉树遍历、汉诺塔问题的递归代码

    一、递归详解 [1] 递归是一种编程技巧,通过函数调用自身来解决问题。递归中包含三个要素:递归定义、递归出口和递归调用。 [2] 递归定义指的是问题可以被分解为同类且更小规模的子问题。在递归过程中,问题会不断被分解为规模更小的子问题,直到达到一个基本情况,

    2024年02月08日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包