C语言递归思想实现汉诺塔详解

C语言递归思想实现汉诺塔详解

什么是汉诺塔问题?

汉诺塔问题是一个古老的数学谜题,也是递归思想的典型应用。问题由以下三个规则定义:

  1. 有三根杆子,第一根杆子上有若干个直径大小不一的圆盘,第二根杆子上一个圆盘没有,第三根杆子上一个圆盘没有。

  2. 每次只能移动一个盘子。

  3. 大盘子不能放在小盘子上面。

目标是从初始状态移动所有圆盘到最后一根杆子上。我们可以用 ABC 三个字符来表示三个杆子。

思路

假设有 $n$ 个圆盘需要从 A 移动到 C,我们可以把问题拆分为以下三个子问题:

  1. 先将 $n-1$ 个圆盘从 A 移动到 B
  2. 将最后一个圆盘从 A 移动到 C
  3. 最后将 $n-1$ 个圆盘从 B 移动到 C

以上思路可以递归地在子问题上进行处理,直到 $n=1$,此时直接把圆盘从 A 移动到 C 即可。

代码实现

以下是代码实现:

#include <stdio.h>

// 将 top 个圆盘从 begin 移动到 end,借助 auxiliary
void Hanoi(int top, char begin, char end, char auxiliary)
{
    if(top == 1)
    {
        // 当只剩下 1 个圆盘时,直接移动到 end
        printf("Move %d from %c to %c\n", top, begin, end);
        return;
    }

    // 将 top-1 个圆盘从 begin 移动到 auxiliary,借助 end
    Hanoi(top-1, begin, auxiliary, end);

    // 将第 top 个圆盘从 begin 移动到 end
    printf("Move %d from %c to %c\n", top, begin, end);

    // 将 top-1 个圆盘从 auxiliary 移动到 end,借助 begin
    Hanoi(top-1, auxiliary, end, begin);
}

int main()
{
    int n = 3; // 三个圆盘
    Hanoi(n, 'A', 'C', 'B');
    return 0;
}

以上代码中,函数 Hanoi() 接受三个参数:需移动的圆盘数量 top、起始杆子 begin、目标杆子 end 和中间杆子 auxiliary

函数中使用了递归思想,将问题分解为子问题处理。当 top=1 时,直接将圆盘从起始杆子移动到目标杆子。如果 top 不为 1,递归调用函数,将 $top-1$ 个圆盘从起始杆子 A 移动到中间杆子 B,再将第 top 个圆盘从 A 移动到 C,最后将 $top-1$ 个圆盘从 B 移动到 C,借助 A。

示例说明

接下来,我们来看一下 n=3 的两个示例:

示例一

将 ${1, 2, 3}$ 三个圆盘从 A 移到 C,借助 B

  1. 将 ${1, 2}$ 两个圆盘从 A 移到 B,借助 C

    1. 将 ${1}$ 圆盘从 A 移动到 C
    2. 将 ${2}$ 圆盘从 A 移动到 B
    3. 将 ${1}$ 圆盘从 C 移动到 B
  2. 将最后一个圆盘 ${3}$ 从 A 移到 C

  3. 将 ${1, 2}$ 两个圆盘从 B 移到 C,借助 A

    1. 将 ${1}$ 圆盘从 B 移动到 A
    2. 将 ${2}$ 圆盘从 B 移动到 C
    3. 将 ${1}$ 圆盘从 A 移动到 C

示例二

将 ${1, 2, 3}$ 三个圆盘从 A 移到 B,借助 C

  1. 将 ${1, 2}$ 两个圆盘从 A 移到 C,借助 B

    1. 将 ${1}$ 圆盘从 A 移动到 B
    2. 将 ${2}$ 圆盘从 A 移动到 C
    3. 将 ${1}$ 圆盘从 B 移动到 C
  2. 将最后一个圆盘 ${3}$ 从 A 移到 B

  3. 将 ${1, 2}$ 两个圆盘从 C 移到 B,借助 A

    1. 将 ${1}$ 圆盘从 C 移动到 A
    2. 将 ${2}$ 圆盘从 C 移动到 B
    3. 将 ${1}$ 圆盘从 A 移动到 B

以上示例说明了在递归过程中,如何按照预定规则移动圆盘,直到所有圆盘从起始位置移动至目标位置。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言递归思想实现汉诺塔详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 文件夹名称能设置颜色吗? 电脑文件夹名字变成绿色的详细教程

    当我们浏览电脑中的文件夹时,文件夹的名称往往都是黑色的。但是,有时我们希望文件夹名称能够显示不同的颜色,比如变成绿色。那么,文件夹名称能设置颜色吗?答案是肯定的。下面我将为大家提供一个详细的教程,帮助大家实现文件夹名称变成绿色。 步骤1:准备工作 在开始操作之前,我们需要准备一下工具: Windows操作系统 超级管理员权限 步骤2:打开“注册表编辑器” 单…

    other 2023年6月26日
    00
  • mysql启动服务时提示’服务名无效’

    以下是“mysql启动服务时提示’服务名无效’”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: mysql启动服务时提示“服务名无效”的解决办法 在启动mysql服务时,有时候会遇到“服务名无效”的错误提示。本文将介绍如何解决mysql启动服务时提示“服务名无效”的问题,并提供两个常见的示例。 1. 原因分析 mysql启动服务时提示“服…

    other 2023年5月10日
    00
  • js input输入百分号保存数据库失败的解决方法

    针对“js input输入百分号保存数据库失败”的问题,我们可以采用以下两种解决方案: 解决方案一:使用encodeURIComponent函数 在将输入数据保存到数据库前,我们可以先使用JavaScript的encodeURIComponent函数对百分号进行编码,以避免保存到数据库中时出现错误。 // 获取输入框的值 const inputValue =…

    other 2023年6月27日
    00
  • 【VB编程】05.MsgBox与InputBox函数

    VB编程:MsgBox与InputBox函数的完整攻略 在VB编程中,MsgBox和InputBox是两个常用的函数,用于显示消息框和输入框。本文将为您提供一份完整攻略,介绍如何使用MsgBox和InputBox函数,包括概念介绍、示例说明等。 概念介绍 MsgBox函数 MsgBox函数用于显示消息框,提示用户进行操作或提醒用户某些信息。MsgBox函数的…

    other 2023年5月5日
    00
  • Android控件之ToggleButton的使用方法

    Android控件之ToggleButton的使用方法 ToggleButton是Android中的一个常用控件,它可以在两种状态之间切换,通常用于表示开关或选项的状态。本攻略将详细介绍ToggleButton的使用方法,并提供两个示例说明。 1. 添加ToggleButton到布局文件 首先,在XML布局文件中添加ToggleButton控件。以下是一个示…

    other 2023年8月26日
    00
  • js中redirect

    以下是关于“JavaScript中的重定向(redirect)”的完整攻略: 什么是重定向 重定向是指将用户从URL地址自动跳转到另一个URL地址的过程。在Web开发中,通常用于将用户从一个页面自动跳转到另一个页面,或者将用户从一个网站自动跳转到另一个网站。 重定向的实现方式 在JavaScript中,可以使用以下两种方式实现重定向: 1. 使用locati…

    other 2023年5月7日
    00
  • 微软发布四月更新Win10正式版ISO镜像MSDN下载地址

    微软发布四月更新Win10正式版ISO镜像MSDN下载地址攻略 本攻略将详细介绍如何获取微软发布的四月更新Win10正式版ISO镜像的MSDN下载地址。请按照以下步骤进行操作: 步骤一:访问微软官方网站 首先,打开您的网络浏览器,并访问微软官方网站。您可以在浏览器的地址栏中输入 https://www.microsoft.com ,然后按下回车键。 步骤二:…

    other 2023年8月4日
    00
  • 批处理ren重命名的方式

    批处理文件可以用于许多重复性的任务中,其中一个任务就是批量重命名文件。Windows提供了一个内置的命令行工具–Ren,它可以帮助我们快速地修改文件名。 以下是批处理ren重命名的方式的完整攻略: 创建批处理文件 在电脑的任意位置右键新建一个txt文件,然后将其文件名改为“批处理文件名.bat”。这里的批处理文件名可以自定义,但后缀必须为.bat。 编写批…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部