【C语言】用函数递归的方法解决汉诺塔问题

news2024/11/22 16:26:23

💓博主csdn个人主页:小小unicorn💓
⏩专栏分类:C语言

🚚代码仓库:小小unicorn的学习足迹🚚
🌹🌹🌹关注我带你学习编程知识

汉诺塔

  • 1.问题起源:
  • 2.汉诺塔游戏规则:
  • 3.递归是什么?
  • 4.问题分析:
    • ==代码实现:==
  • 5.结果分析:

1.问题起源:

汉诺塔(又称河内塔)问题是印度的一个古老的传说。开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。后来,这个传说就演变为汉诺塔游戏。

2.汉诺塔游戏规则:

简单来说,就是把a柱上的n个圆盘,通过b柱作为辅助全部搬运到c柱上去。在搬运的过程中一次只能搬运一个圆盘,而且大圆盘不能放到小圆盘上面。
在这里插入图片描述

3.递归是什么?

要用递归的方法解决这个问题,我们首先要知道何为递归。
递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。
当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。
所以递归要有两个要素,结束条件与递推关系。

4.问题分析:

我们很容易知道:
当n=1时,我们直接将盘子从a柱移到c柱便解决了问题。
当n=2时,我们可以先把a柱上的第一个盘子移动到b柱(a柱最上面的盘子编号为1,向下依次递增),然后将a柱上的第二个盘子移动到c柱,再将b柱上的盘子移动到c柱即可。
但是当n的值为3及以上时问题便变得麻烦起来了。那么我们能否将后面复杂的问题化简为前面简单的两种情况呢?
答案是肯定的,这也是函数递归的目的:将复杂的问题简单化。

代码实现:

我们可以先通过动图先来看一下具体怎么实现。

汉诺塔问题(函数递归)

我们只需将盘子个数为n的分为两类解决即可:
当n=1时,将盘子从a->c即可。
当n>1时,将a柱上的n-1个盘子移动到b柱上,再将a柱上剩下的一个(也就是第n个)移动到c柱上,然后将b柱上的n-1个移动到,c柱上即可。(记住我们这里是将n-1个盘子看为一个整体)

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//汉诺塔问题
int count = 0;
void move(int n, char a, char b, char c)
{
	if (n == 1)
		printf("第%d次:%c->%c\n", ++count, a, c);
	else
	{
		move(n - 1, a, c, b);
		printf("第%d次:%c->%c\n", ++count, a, c);
		move(n - 1, b, a, c);
	}
}

int main()
{
	int n = 0;
	printf("请输入圆盘的个数:\n");
	scanf("%d", &n);
	move(n, 'a', 'b', 'c');
	printf("共移动了%d次\n", count);
	return 0;
}

测试结果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.结果分析:

我们会发现,当圆盘为1的时候只用移动一次,但当圆盘为4时,要15次,可想而知,这个问题设计计算量是很大的,而且还会发现,当圆盘个数特别大时,电脑运算速度会明显降低,因为计算机要通过不停进行递归,所以递归只是解决题目的一种方法。在我看来汉诺塔问题包括大多数能用函数递归解决的问题都需要我们有一种能力,那就是将一些东西当作一个整体来看待。比如汉诺塔问题中我们就要将n-1看作一个整体,如果不能做到有这种理解能力,那么将很难理解如何用函数递归解决汉诺塔问题。

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

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

相关文章

可扩展的单核至四核Cortex-A53@1.4GHz工业级核心板规格书

1 核心板简介 创龙科技SOM-TL62x是一款基于TI Sitara系列AM62x单/双/四核ARM Cortex-A53 + 单核ARM Cortex-M4F多核处理器设计的高性能低功耗工业核心板,通过工业级B2B连接器引出2x TSN Ethernet、9x UART、3x CAN-FD、GPMC、2x USB2.0、CSI、DISPLAY等接口。处理器ARM Corte…

什么软件可以文字转语音?来试试这几种工具

将文字转换成语音可以帮助那些有视觉障碍或者阅读困难的人更容易地获取信息。这些人可能无法看到屏幕上的文字&#xff0c;但是能够通过听声音来理解信息。其次&#xff0c;它还可以作为一种语言学习工具&#xff0c;例如帮助人们提高语言发音能力&#xff0c;因为它可以提供标…

使用Python爬虫采集网络热点

在当今信息爆炸的时代&#xff0c;了解网络热搜词和热点事件对于我们保持时事敏感性和把握舆论动向非常重要。在本文中&#xff0c;我将与你分享使用Python爬虫采集网络热搜词和热点事件的方法&#xff0c;帮助你及时获取热门话题和热点新闻。 1. 网络热搜词采集 网络热搜词是人…

生成地图展示-广东省【Python思路】

在【生成图片展示】博客的基础上&#xff0c;进一步的确定某个省份的数据。 # 以下数据均为人造数据&#xff0c;仅供学习# 1.导包 from pyecharts.options import * from pyecharts.charts import Map import json# 2.打开、读取、关闭文件 f open("D:/Typora 记事本/n…

【C/C++】虚函数调用流程 | 虚函数和一般函数的区别

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

C++信息学奥赛1144:单词翻转

#include <iostream> #include <string> using namespace std; int main() {string str;// 输入一行字符串getline(cin, str);string arr;for (int i 0; i < str.length(); i){if (str[i] ! ){arr str[i]; // 将非空格字符添加到临时存储的字符串中}else{for…

spring5.x-声明式事务原理及源码实现

上文&#xff1a;spring5.x-AOP实现原理及源码分析 本系列文章&#xff1a; spring5.x-AOP实现原理及源码分析 spring5.x-监听器原理及源码实现 spring5.x-解决循环依赖分析 spring5.x-IOC模块源码学习 spring5.x介绍及搭配spring源码阅读环境 基础知识 请先学习…

高职教育应对ChatGPT应用的策略

一、完善顶层设计&#xff0c;提升技术水平 在推广ChatGPT平台的过程中&#xff0c;高职院校需要关注技术本身的问题。这就需要在国家和地方政府的引导下&#xff0c;引入更完善的技术顶层设计&#xff0c;提高人工智能在高职教育中的运用水平。具体来说&#xff0c;一方面需要…

信息化发展3

信息化体系 国家信息化体系包括信息技术应用&#xff08;龙头&#xff09; 、信息资源&#xff08;核心&#xff09; 、信息网络&#xff08;基础设施&#xff09; 、信息技术和产业&#xff08;国家信息化建设基础&#xff09; 、信息化人才&#xff08;关键&#xff09; 、信…

Android常用组件:空布局empty_view,占位图封装

最近在做一件费劲不讨好的事情&#xff0c;那就是把项目中无关业务的代码功能模块抽出来&#xff0c;供以后使用。 既然费劲心机&#xff0c;不妨分享出来&#xff0c;大家可以一块学习借鉴。 直接来看看空布局的界面效果&#xff1a; 基本的布局就是以下结构&#xff1a; xm…

Python中的装饰器介绍

装饰器是Python编程语言中一种强大的特性&#xff0c;用于修改或增强函数或类的行为&#xff0c;而无需对它们本身进行修改。装饰器通常被用于在不改变原始代码的情况下&#xff0c;向函数或方法添加额外的功能&#xff0c;如日志记录、权限检查、数据格式转换等。装饰器本质上…

从小学到高考:讲述我与儿子的成长故事

三年前&#xff0c;当儿子考上高中的时候&#xff0c;我就想着写一篇文章做纪念&#xff0c;然后写了一半就放弃了&#xff0c;因为初中阶段充满了遗憾。在儿子高一拿到好成绩时&#xff0c;我又想着写一篇文章以作鼓励&#xff0c;写了一半也放弃了&#xff0c;因为革命尚未成…

聊天平台Revolt的搭建

经网友 凌尘 提醒&#xff0c;Web-Check 最新的镜像版本&#xff0c;容器端口已经从 8888 改为了 3000&#xff0c;特此更正&#xff01; 什么是 Revolt &#xff1f; Revolt 是一个开源的用户至上的聊天平台。是在不牺牲任何可用性的情况下与朋友和社区保持联系的最佳方式之一…

帝国CMS仿管理资源吧资料下载网站模板源码/下载会员+积分付费下载功能自动采集资源网站源码

帝国CMS仿管理资源吧资料下载网站模板源码&#xff0c;带下载会员积分付费下载功能自动采集资源网站源码&#xff0c;管理资源吧——为中小企业管理者提供全方位的管理资料下载服务&#xff1b;是一个所有资料免费下载&#xff0c;免注册、免登陆、免积分的公益性的管理知识共享…

地球的“第三极”及其在全球气候中的作用

青藏高原是全球气候系统的重要力量&#xff0c;也是气候变化的热点地区。一项新的审查总结了知识状况并确定了与该地区相关的研究需求。 西门措湖是一个冰川冰碛湖&#xff0c;坐落在青藏高原的山​​峰之中。图片来源&#xff1a;Tenace10/Wikimedia Commons &#xff0c; 资料…

ModaHub魔搭社区:WinPlan经营大脑开放API调用指南

本文主要是介绍开放API调用流程 1. 开放API调用流程 1.1 创建API-TOKEN 即API访问凭证, 是用户在调用API接口时的应用和组织身份凭证,请妥善保管。如遇到丢失或者泄漏的情况,请及时重新生成。 API-TOKEN生成方式: 请前往[管理中心]->[数据集成]页面创建/重新生成。Win…

将Series序列中的缺失值用后一个值填充Series.bfill()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对于Series序列中的缺失值n1 用n1后面的值n2来填充替代 Series.bfill() [太阳]选择题 关于以下代码的说法中错误的是? import numpy as np import pandas as pd a pd.Series([1,np.nan,2,np.…

PCI控制器扫描PCI总线过程解析

1、PCI的三种地址空间介绍 地址空间描述命令说明I/O空间供给设备驱动程序使用I/O操作命令对设备对应的I/O地址空间进行访问&#xff0c;此类访问不可预取存储空间供给设备驱动程序使用memory操作命令对设备的Memory空间进行访问&#xff0c;其中Memory操作命令又可分为Prefech…

Linux部署RocketMQ并使用SpringBoot创建生产、消费者

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;RocketMQ、消息队列☀️每日 一言&#xff1a;在你心灰意冷、心烦意乱时也不要停下你的脚步&#xff01; 一、前言 RocketMQ&#xff08;Apache RocketMQ&#xff09;是一种开源的分布式消息中间…

【Day-21慢就是快】代码随想录-栈与队列-逆波兰表达式求值

逆波兰表达式&#xff1a;是一种后缀表达式&#xff0c;所谓后缀就是指运算符写在后面。 平常使用的算式则是一种中缀表达式&#xff0c;如 ( 1 2 ) * ( 3 4 ) 。 该算式的逆波兰表达式写法为 ( ( 1 2 ) ( 3 4 ) * ) 。 逆波兰表达式主要有以下两个优点&#xff1a; 去掉…