C语言运用函数的递归实现汉诺塔

C语言运用递归实现汉诺塔的攻略

理解汉诺塔问题

汉诺塔问题是经典的递归运用问题。可以转化为:将n个盘从A经由B移动到C,其中每次只能移动一个盘,且在移动过程中不能将大盘放在小盘上面。如下图所示:

     |           |           |
    ===          |           |
   =====         |           |
  =======        |           |
 =======         |           |
---------------- A --------- B --------- C

理解递归思想

递归是一种函数自己调用自己的算法。实现递归的方法是:找到一个最基本、最小的问题解,利用它来结束函数的递归。而且每次递归调用规模相比初始时都有所减少。因此,我们通常使用递归求解复杂问题,可以减少程序代码的复杂性。

使用递归求解汉诺塔问题

递归求解汉诺塔问题的思想是:把n个盘子从A柱移到C柱,可以分为三个步骤:

  • 将前n-1个盘子从A移动到B,利用C作为中转站;
  • 将第n个盘子从A移到C;
  • 将B柱上的n-1个盘子移动到C,利用A作为中转站。

然后我们发现,第一步和第三步可以直接套用递归函数来实现,实现代码如下:

void hanoi(int n, char a, char b, char c) {
    if (n == 1)
        printf("%c -> %c\n", a, c);
    else {
        hanoi(n-1, a, c, b);    // Step 1
        printf("%c -> %c\n", a, c);    // Step 2
        hanoi(n-1, b, a, c);    // Step 3
    }
}

其中,n表示盘子的数量,a、b、c分别表示三个柱子。当n等于1时,直接将一个盘子从a移到c;否则,将前n-1个盘牌从a移到b(利用c作为中转站),再将第n个盘子从a移到c,最后将b上的n-1个盘子移动到c(利用a作为中转站)。这三个步骤经过递归自然就会实现。

示例

  1. 当有三个盘子时,运行下面的代码:
int main() {
    int n = 3;
    hanoi(n, 'A', 'B', 'C');
    return 0;
}

其输出结果如下:

A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
  1. 当有四个盘子时,运行下面的代码:
int main() {
    int n = 4;
    hanoi(n, 'A', 'B', 'C');
    return 0;
}

其输出结果如下:

A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
A -> C
B -> C
B -> A
C -> A
B -> C
A -> B
A -> C
B -> C

总结

递归求解汉诺塔问题是经典的递归运用问题。实现递归的方法是:找到一个最基本、最小的问题解,利用它来结束函数的递归。要注意每次递归调用规模相比初始时都有所减少,才能够达到问题的求解。

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

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++实现职工信息管理系统

    C++实现职工信息管理系统 介绍 C++实现职工信息管理系统是一个简单的控制台应用程序,用于管理一个公司中的职工信息。主要的功能包括添加职工、显示职工列表、删除职工、修改职工信息等。 实现步骤 步骤一:设计职工信息类 我们首先需要设计一个职工信息类,它包括职工编号、职工姓名、职工职位和职工性别等信息。这个类可以使用C++中的结构体来实现。 // 职工信息结构…

    C 2023年5月23日
    00
  • json.stringify()与json.parse()的区别以及用处

    JSON在现代Web应用程序开发过程中扮演着非常重要的角色。它是一种数据格式,用来交换数据,而且被广泛使用。JS开发者通常需要将JS对象转换为JSON格式,然后将其发送到服务器或者持久性存储,JSON也会从服务器返回,然后被转换为JS对象。这个过程需要使用JSON.stringify()和JSON.parse()这两个方法来进行。 JSON.stringif…

    C 2023年5月23日
    00
  • C++设计模式之享元模式(Flyweight)

    C++设计模式之享元模式(Flyweight)攻略 概述 享元模式是一种结构型设计模式,它的主要目标是减少对象的数量,通过尽可能多的与其他相似对象共享来最小化内存占用和计算量。 在享元模式中,所有共享对象都以一个单一的实例存在于内存中,因此系统需要考虑识别这些对象以便正确地重用已经存在的实例,而不是创建新的对象。具体实现时,享元模式通过将需要重复使用的属性划…

    C 2023年5月22日
    00
  • mybatis plus常用注解的具体使用

    下面是关于MyBatis Plus常用注解的具体使用攻略。 简介 MyBatis Plus是一个开源的基于MyBatis的ORM框架,可以用于快速的进行Java Web应用的开发。MyBatis Plus提供了很多方便的注解,用于简化SQL语句编写和提高开发效率。 常用注解 @TableName @TableName 注解用于标识当前实体对应的表名。如果实体…

    C 2023年5月22日
    00
  • 易语言通过“打开”命令操作数据库

    下面是易语言通过“打开”命令操作数据库的完整攻略。 1. 设置数据库连接字符串 在使用打开命令连接数据库之前,我们需要先设置数据库连接字符串,用于连接目标数据库。可参考下面的代码示例进行设置: ‘ 使用ADO连接MySQL数据库 数据库类型常量 定义值:sql_mysql 数据库名称常量 定义值:"testdb" 服务器名称常量 定义值:…

    C 2023年5月22日
    00
  • C 程序 查找数组元素的总和

    C程序 查找数组元素的总和 简介 本程序通过输入一个包含n个数的整型数组,求出数组中所有元素的总和。 使用攻略 编译环境 本程序使用C语言编写,建议使用gcc编译器,在Linux环境下执行。 输入数组 程序使用scanf函数从标准输入中读入数组元素,用户需输入n个整型数值,以空格或换行符分隔。 示例输入: 5 1 2 3 4 5 程序设计 本程序使用for循…

    C 2023年5月9日
    00
  • 用Visual Studio2017写C++静态库图文详解

    下面是详细的“用Visual Studio2017写C++静态库”的攻略: 步骤一:创建静态库项目 打开Visual Studio 2017,点击“新建项目”。 在弹出的“新建项目”窗口中选择“Visual C++” -> “Windows桌面向导” -> “库”。 在“下一步”中输入项目名称并选择一个保存路径,点击“创建”按钮。 在弹出的“添加…

    C 2023年5月23日
    00
  • Python实现打砖块小游戏代码实例

    Python实现打砖块小游戏代码实例 1. 简介 本文将介绍如何使用Python编写一个简单的打砖块小游戏代码,该代码使用Pygame库实现。 2. 环境搭建 在开始编写代码之前,我们需要安装Pygame库。这可以通过以下命令在终端中执行来安装: pip install pygame 3. 初始化 我们首先需要导入所需的库和模块,例如: import sys…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部