经典递归算法——汉诺塔问题

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

一、问题背景简介

经典递归算法——汉诺塔问题

         相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。 

二、解题思路

        首先我们需要先明确我们每一步的目的,这里我们自底向上来进行思考,首先我们我们想到如果我们要将A上的所有盘子移动到C上,又得随时保证大盘子在下面小盘子在上面,那么我们开始思考如何将最大的盘子先放到C上,这样才能进行下一步。

        我们先明确ABC三个柱子的角色,一个作为起始位置、一个作为中转的位置、一个是目的位置;我们开始从最大的盘子开始自底向上考虑,这里我用四个盘子来做例子:

        ①我们要将第四个盘子移动到C,那么前三个盘子就必须先移动到B,这样才能让第四个盘子直接移动到C(因为要移动最下面的盘子的话,必须整个柱子只剩它一个或者它在最上层才能移动);

        ②要将前三个盘子移动到B,第三个盘子就要在B的最下面,现在就将第三个盘子看做底,那么肯定前两个盘子就要先移动到C,这样第三个盘子才能直接移动到B;

        ③要将前两个盘子移动到C,那么第二个盘子就必须在C的最下面,现在将第二个盘子看做底,那么第一个盘子就必须先移动到B,这样第二个盘子才能直接移动到C;

        ④第一个盘子可以直接移动到B;

        以上就是有四个盘子的时候第一步的思考,思考过程反过来就是移动步骤;每一步中的移动的思维就差不多;在同一层递归的整体的步骤就是:先将要移动的盘子上面的盘子放到中转的位置去,然后再把要移动的盘子放到目标位置去,最后将中转的位置的盘子再放到目标位置就完成了;每移动一次目标盘子,就需要执行一次以上步骤,因为我们移动的整体思路是自下而上的移动,所以只有当移动的盘子是最顶上的盘子或者只有它一个盘子的时候不需要执行这个三步;所以只要涉及到移动多个盘子就需要进行上述步骤,所以在每层递归中一开始的当前位置到中转,和最后的中转到目标位置,都需要递归执行,只有中间的当前位置直接到目标位置的这一步只移动一个盘子不需要递归。

三、代码实现展示

        1、Python实现

def Hanoi(n, current, transit, target):
    if n == 1:
        print(current, "-->", target)
    else:
        Hanoi(n - 1, current, target, transit)
        print(current, "-->", target)
        Hanoi(n - 1, transit, current, target)


num = input("输入汉诺塔的层数:")
Hanoi(num, 'A', 'B', 'C')

                 这里需要注意一下递归的时候当前位置、中转位置、以及目标位置的转变(实参、形参的变化)。

        2、C语言实现

#include "stdio.h"

void Hanoi(int n,char current,char transit,char target){
    if(n == 1){
        printf("%c-->%c\n",current,target);
    } else{
        Hanoi(n - 1,current,target,transit);
        printf("%c-->%c\n",current,target);
        Hanoi(n - 1,transit,current,target);
    }
}
int main() {
    int n;
    printf("请输入汉诺塔的层数:");
    scanf("%d",&n);
    Hanoi(n,'A','B','C');
}

                基本和python差不多。文章来源地址https://www.toymoban.com/news/detail-458019.html

到了这里,关于经典递归算法——汉诺塔问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 汉诺塔问题(C语言递归实现)

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

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

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

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

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

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

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

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

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

    2024年02月08日
    浏览(40)
  • C语言递归算法实现经典例题

    递归是一种编程技术,它通过在函数内部反复调用自身来解决问题。当一个程序调用自己时,这就称为递归调用。递归可以有助于简化某些算法的实现和理解。在递归过程中,每个调用都会将一些数据保存在栈上,直到递归结束后才能被处理并弹出栈。 递归通常有两个部分:

    2024年02月05日
    浏览(58)
  • 汉诺塔+小青蛙跳台阶---《递归》

    目录 前言: 1.汉诺塔: 1.1分析盘子数从1-3的情况 1.2盘子移动的规律总结 2.青蛙跳台阶: 2.1跳一个台阶或跳两个台阶 2.2扩展 ❤博主CSDN:啊苏要学习   ▶专栏分类:C语言◀   C语言的学习,是为我们今后学习其它语言打好基础,C生万物!   开始我们的C语言之旅吧!✈   在学

    2024年02月03日
    浏览(39)
  • leetcode原题:颜色填充(经典的递归问题)

    题目: 编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。 待填充的图像用二维数组 image 表示,元素为初始颜色值。初始坐标点的行坐标为 sr 列坐标为 sc。需要填充的新颜色为 newColor 。 「周围区域」是指颜色相同且在上、下、左、右四个方向上存在相连情况的

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

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

    2023年04月08日
    浏览(40)
  • 汉诺塔(Tower of Hanoi)--------递归思路

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

    2024年02月08日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包