C语言中的递归问题——汉诺塔问题

        汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。传说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

求解思路:
三根柱子(标记为 A、B、C),在柱子 A 上有从小到大叠放的n个圆盘,要将这n个圆盘从柱子 A 借助柱子 B 全部移动到柱子C上,移动过程中需要遵循以下规则:
1.每次只能移动一个圆盘。
2.大圆盘不能放在小圆盘上面。

代码实现及解析:

#include <stdio.h>//将src座上的n个盘子,以mid座为中转,移动到dest座
void hanoi(int n, char src, char mid, char dest)
{//src:通常代表“source”,意思是起点或源。//dest:通常代表“destination”,意思是终点或目标。//mid:可能代表“middle”,意思是中间点或中间节点。if (n == 1)//只需移动一个盘子{//直接将盘子从src移动到dest即可printf("%c->%c ", src, dest);return;}hanoi(n - 1, src, dest, mid);//先将n-1个盘子从src移动到midprintf("%c->%c ", src, dest);//再将一个盘子从src移动到desthanoi(n - 1, mid, src, dest);//最后将n-1个盘子从mid移动到dest
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}//跟后文的代码的区别在于,在n==1时,如果不执行return语句终止函数,就会依次执行后面三行代码(我们不希望执行后面三行代码)。而后文那个代码形式,如果n==1,else里面的代码就不执行了。

补充上面代码中“void hanoi(int n, char src, char mid, char dest)”函数中的return语句的解释:

        void函数明确表示该函数不返回任何值。

1. 核心规则

        在C语言中,将一个函数的返回类型声明为 void,就是告诉编译器和程序员:“这个函数执行一些操作,但不会产生一个可供使用的返回值。” 因此,在 void 函数中使用 return 语句来返回一个值是非法的,会导致编译错误。

2. return 语句在 void 函数中的用法(可选)

        虽然不能返回一个值,但你仍然可以在 void 函数中使用 return 语句。它的作用不再是返回值,而是立即终止函数的执行,提前从函数中退出。

这在某些条件下提前结束函数执行的场景中非常有用。

更多代码实现(功能一样,代码有细微区别):

#include <stdio.h>//将src座上的n个盘子,以mid座为中转,移动到dest座
void hanoi(int n, char src, char mid, char dest)
{//src:通常代表“source”,意思是起点或源。//dest:通常代表“destination”,意思是终点或目标。//mid:可能代表“middle”,意思是中间点或中间节点。if (n == 1)//只需移动一个盘子{//直接将盘子从src移动到dest即可printf("%c->%c ", src, dest);}else{hanoi(n - 1, src, dest, mid);//先将n-1个盘子从src移动到midprintf("%c->%c ", src, dest);//再将一个盘子从src移动到desthanoi(n - 1, mid, src, dest);//最后将n-1个盘子从mid移动到dest}
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}//跟前文的代码的区别在于,如果n==1,else里面的代码就不执行了。前文那个代码形式,在n==1时,如果不执行return语句终止函数,就会依次执行后面三行代码(我们不希望执行后面三行代码);
#include <stdio.h>void move(char from, char to)
{printf("%c->%c", from, to);
}//将src座上的n个盘子,以mid座为中转,移动到dest座
void hanoi(int n, char src, char mid, char dest)
{    //src:通常代表“source”,意思是起点或源。//dest:通常代表“destination”,意思是终点或目标。//mid:可能代表“middle”,意思是中间点或中间节点。if (n == 1)//只需移动一个盘子{//直接将盘子从src移动到dest即可move( src, dest);}else{hanoi(n - 1, src, dest, mid);//先将n-1个盘子从src移动到midmove(src, dest);//再将一个盘子从src移动到desthanoi(n - 1, mid, src, dest);//最后将n-1个盘子从mid移动到dest}
}int main()
{int number = 0;scanf("%d",&number);hanoi(number,'A','B','C');printf("\n");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/99115.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/99115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArkAnalyzer源码初步分析I——分析ts项目流程

1.前言&#xff1a; 鸿蒙程序分析框架ArkAnalyzer&#xff08;方舟分析器&#xff09; 源码地址 入门文档 2.阅读入门文档后&#xff1a; 本人具有一定的Java开发经验。虽然我对 TypeScript&#xff08;TS&#xff09;和 ArkTS 还不熟&#xff0c;但很多概念对我这个 Java 开…

c#基础二(类和对象,构造器调用顺序、访问级别、重写和多态、抽象类和接口)

一、类1.0对象初始化器class Student {public String name;public int age { get; set; } } internal class Program {static void Main(string[] args){ //写法一Student stunew Student();stu.name"Tom";stu.age20;//写法二Student stu2 new Student { name &qu…

Qt之快捷键、事件处理、自定义按键——完成记事本项目

快捷键我们电脑中的记事本中还支持快捷键&#xff0c;如“CTRLO”打开文件、“CTRLS”保存文件在Qt中使用QShortcut这个类创建快捷键在.cpp文件的构造函数中创建QShortcut对象&#xff0c;绑定打开文件和保存文件的槽函数放大缩小字体还是在.cpp的构造函数中编写代码Widget::Wi…

Open cascade中如何使用BRepAlgoAPI_Splitter分割一个Face

理论介绍 在OpenCASCADE几何建模内核中&#xff0c;BRepAlgoAPI_Splitter是一个强大的工具&#xff0c;用于将一个形状&#xff08;Shape&#xff09;用另一个形状&#xff08;Tool&#xff09;进行分割。这种操作在CAD建模中非常常见&#xff0c;比如用平面切割实体、用曲线分…

【医疗 AI】Baichuan-M2 医疗大模型:技术解读与使用方法

【医疗 AI】Baichuan-M2 医疗大模型&#xff1a;技术解读与使用方法1. Baichuan-M2 医疗大模型简介1.1 基本信息1.2 下载地址1.3 技术特点2. Baichuan-M2 模型技术报告2.1 摘要2.2 医学性能评估2.2.1 HealthBench基准2.2.2 中国医疗场景对比评估2.3 系统架构2.3.1 验证器系统2.…

unity pcd 二进制版 简单显示文件对象(单色)

unity Point Cloud Viewer and Tool 那个插件不支持pcd二进制&#xff0c;而且网上到处都是AI 我恨这种AI滥用&#xff0c;提供不了一点价值 好了&#xff0c;言归正传 可以在Point Cloud Viewer and Tool这个插件报错地方转用这个代码&#xff0c;具体咋结合请自行研究。 …

强大的开源文档问答工具-Kotaemon

Kotaemon 是一个基于 RAG&#xff08;Retrieval-Augmented Generation&#xff09;架构的开源文档问答工具&#xff0c;为用户提供与文档对话的智能交互体验。该项目同时服务于终端用户和开发者&#xff0c;具有高度的可扩展性和定制化能力。技术栈分析核心技术栈后端框架Pytho…

区块链:搭建简单Fabric网络并调用智能合约

使用docker服务搭建Hyperledger/fabric网络的详细教程&#xff0c;实现构建多节点的简单联盟链&#xff0c;并编写、调用智能合约实现投票业务。 目录 背景知识 Hyperledger Fabric 基本组件 交易(Transaction) 智能合约 实验目的 实验环境 基础依赖 安装Golang 安装do…

Web前端面试题(2)

Web前端面试题(附答案及解析)&#xff08;2025.9月最新版&#xff09;-CSDN博客 1.link 与 import 的区别和用法 主要区别 特性<link>import语法类型HTML标签CSS规则加载方式并行加载&#xff08;与其他资源同时加载&#xff09;串行加载&#xff08;必须等待主CSS文件…

Paxos协议

目录 Paxos 是什么&#xff08;What&#xff09; Paxos 的目的&#xff08;Why&#xff09; 角色与职责&#xff08;Who&#xff09; 基本流程&#xff08;How&#xff09; 常见问题与对策 什么是多数派&#xff08;Quorum&#xff09; Paxos vs Raft 异同点 Paxos 是什…

第十二篇:Qcom Camx打印实时帧率 FPS

一、第一种方式(有些低平台可能没有) adb shell setprop persist.vendor.camera.enableFPSLog TRUE adb shell setprop persist.vendor.camera.systemLogEnable TRUE adb shell setprop vendor.debug.camera.overrideLogLevels 0xff chi-cdk/core/chiframework/chxextensi…

TRAE通用6A规则+敏捷开发5S规则

网上研究别人的一些规则,也搞一份给大家 6A工作流项目规则 身份定义 你是一位资深的软件架构师和工程师,具备丰富的项目经验和系统思维能力。你的核心优势在于: 上下文工程专家:构建完整的任务上下文,而非简单的提示响应 规范驱动思维:将模糊需求转化为精确、可执行的规…

【Nginx开荒攻略】Nginx主配置文件结构与核心模块详解:从0到1掌握nginx.conf:

目录 引言 1 nginx.conf的整体结构 2 main全局块详解 2.1 核心指令解析 2.1.1 user&#xff1a;运行用户 2.1.2 worker_processes&#xff1a;工作进程数 2.1.3 pid&#xff1a;PID文件路径 2.1.4 worker_rlimit_nofile&#xff1a;文件描述符限制 2.2 main块配置示例…

【前端教程】从基础到优化:一个登录页面的完善过程

最近做了一个简单的登录页面,主要练习了文本框的onfocus与onblur事件的使用。虽然功能实现了,但仔细想想还有不少可以改进的地方。今天就来分享一下这个登录页面的开发过程和优化思路。 初始实现与解析 先来看一下最初的实现代码: <!DOCTYPE html> <html> &l…

独家 | 抖音生活服务调整:涂晴接管市场和达人运营,旭凯担任北部大区负责人

文/刀客doc(头条精选作者)刀客doc独家获悉&#xff0c;9月8日抖音生活服务完成新一轮组织调整&#xff0c;并已在内部all hands完成官宣。此次调整主要涉及北部大区、达人运营与市场部三大条线的人事轮换与汇报关系变更。核心变动如下&#xff1a;涂晴&#xff0c;原抖音生活服…

class_9:java 抽象类和接口

抽象类 需要用abstract 修饰类和接口abstract class Person{String address;String name;abstract public void eat();abstract public void drink();public void printInfo(){System.out.println("name " name);}} class Student extends Person{public void eat()…

【C++】队列queue的使用

语法 在 C 中&#xff0c;队列的语法如下&#xff1a; #include <queue>// 声明队列 std::queue<Type> q;这里 Type 是队列中存储元素的数据类型。 常用操作 队列提供了以下常用操作&#xff1a; empty(): 检查队列是否为空。 size(): 返回队列中的元素数量。 fron…

HTTP 协议的基本格式

目录 &#xff08;一&#xff09;HTTP是什么 &#xff08;二&#xff09;报文格式 &#xff08;1&#xff09;请求 ①首行 1.URL 2.方法&#xff08;method&#xff09; Ⅰ.GET Ⅱ.POST Ⅲ.PUT Ⅳ.DELETE 3.版本号 ②请求头&#xff08;header&#xff09; 1.键值对…

计算机网络的基本概念-2

1、数据交换技术&#xff1a;电路交换、报文交换与分组交换网络核心部分的关键设备是路由器&#xff0c;其工作方式是分组交换。要理解分组交换&#xff0c;必须先了解其前两种技术。1. 电路交换 (Circuit Switching)核心思想&#xff1a;通信前必须预先建立一条专用的物理通路…

车载网络技术--SOME_IP协议详解

文章目录前言SOME/IP概念SOME/IP协议格式SOME/IP功能介绍序列化序列化规则发布和订阅服务发现&#xff08;SOME/IP-SD&#xff09;SOME/IP-TP协议使用场景SOME/IP-TP协议参考文章&#xff1a;前言 本文介绍了SOME/IP协议的具体内容&#xff0c;包括报文格式&#xff0c;协议选…