C++大学教程(第九版)6.38汉诺塔问题

news2024/11/24 9:12:39

文章目录

  • 题目
  • 代码
  • 运行截图

题目

(汉诺塔问题)在这一章中大家了解了既可以用递归方法又可以用迭代方法很容易实现的函数。不过,在这道练习题中,我们提出的问题若用递归来解决,则尽显递归之优雅:若用迭代来实现,恐怕没那么容易。
汉诺塔问题是每个新一代的计算机科学家必须掌握的最著名的经典问题之一。传说在遥远的东方有一座庙,僧侣们尝试把一叠金盘从一根木桩上移到另一根木上(如图6.34 所示)。起初有64个金盘串在一个木桩上,从下到上尺寸逐步缩小。僧侣们尝试着按照一次只能移动一个金盘并目大的金盘永远不能放在小的金盘上面的规定,将这叠金盘移动到另外一个木桩上。总共有三个木桩,一个用于暂放金盘。按照推测,僧侣们完成他们的工作之时,正是地球毁灭之日。若真是这样,我们可不愿意助他们一臂之力了。
在这里插入图片描述
假设僧侣们想把盘子从木桩1移到木3。我们希望开发一个算法,显示僧侣从木桩到木桩移动盘子的序列。
如果使用传统的方法来处理这个问题,会很快发现我们陷人到这堆盘子的管理之中而无法自拔这个问题很棘手,似乎没有什么希望解决它。然而,用递归的方法来处理这个问题,解决思路就很简单。移动n个盘子问题可以看成如下所示的移动n-1个盘子的问题(因此是递归问题):
a)把n-1个盘子从木桩1移到木桩2把木3作为临时存放点
b)把最后一个盘子(最大的)从木桩1移到木3。
c)把n-1个盘子从木桩2移到木3把1作为临时存放点。
当最后一次任务只有n=1个盘子要移动时(即基本情况),整个过程就结束了。这时只需要轻松地把盘子移过去就可以了,不再需要临时存放点。请编写一个程序解决汉诺塔问题。其中利用一个具有4个参数的递归函数,这4个参数如下所示:
a)备动的盘子数
b)最初放置这些盘子的木桩
c)最后放置这些盘子的木桩
d)作为临时存放点的木桩

关于汉诺塔问题的详细解释,参考文章:
汉诺塔问题简单解释

最初的盘子数n与移动次数moveCount的关系:moveCount=2^(n-1)

程序应该打印出将这些盘子从起始木桩移动到目的木桩所采取的准确步骤。例如,把三个盘子从木桩1移动到木桩3,程序应该打印出如下的移动序列:
在这里插入图片描述

代码

#include <bits/stdc++.h>
using namespace std;
int moveCount = 0;

void TowerofHanoi(int, int, int, int);

int main()
{
    // int n;
    // cout << "请输入盘子的个数:";
    // cin >> n;
    TowerofHanoi(3, 1, 3, 2);
    return 0;
}

void TowerofHanoi(int n, int source, int destination, int auxiliary)
{
    if (n == 1)
    {
        moveCount++;
        cout << "第" << moveCount << "步: " << source << " → " << destination << endl;
        return; // 此处必须有return语句,否则n会变成负数,从而无法结束递归
    }
    TowerofHanoi(n - 1, source, auxiliary, destination);
    moveCount++;
    cout << "第" << moveCount << "步: " << source << " → " << destination << endl;
    TowerofHanoi(n - 1, auxiliary, destination, source);
}

运行截图

在这里插入图片描述

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

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

相关文章

Shell脚本的编程规范和变量类型

一. 了解编程 1.程序编程风格 面向过程语言 开发的时候 需要一步一步执行 问题规模小&#xff0c;可以步骤化&#xff0c;按部就班处理 以指令为中心&#xff0c;数据服务于指令 C&#xff0c;shell 面向对象语言 开发的时候 将任务当成一个整体 将编程看成是一个…

云原生全栈监控解决方案(全面详解)

【作者】JasonXu 前言 当前全球企业云化、数字化进程持续加速&#xff0c;容器、微服务等云原生技术在软件架构中快速渗透&#xff0c;IT 架构云化、复杂化持续驱动性能监控市场。企业云化、数字化持续转型&#xff0c;以及为了考虑系统的弹性、效率&#xff0c;企业软件开发中…

《小学生作文辅导》期刊投稿邮箱

《小学生作文辅导》是国家新闻出版总署批准的正规教育类期刊&#xff0c;适用于全国各小学语文老师事业单位及个人&#xff0c;具有原创性的学术理论、工作实践、科研成果和科研课题及相关领域等人员评高级职称时的论文发表&#xff08;单位有特殊要求除外&#xff09;。 栏目…

RTDETR 引入 超越自注意力:面向医学图像分割的可变形大卷积核注意力

医学图像分割在转换器模型的应用下取得了显著的进展,这些模型擅长捕捉广泛的上下文和全局背景信息。然而,这些模型随着标记数量的平方成比例增长的计算需求限制了它们的深度和分辨率能力。大多数当前的方法通过逐层处理D体积图像数据(称为伪3D),在处理过程中错过了关键的跨…

alfred自定义谷歌翻译workflow

如果要实现自定义workflow&#xff0c;则必须安装付费版的alfred&#xff0c;囊中羞涩的话可以自行淘宝。自定义步骤如下&#xff1a; 1. 新建空的workflow&#xff0c;填写基本信息 2. 开发python脚本 打开该workflow所在目录&#xff0c;进行下面步骤&#xff1a; 首先安装…

【GitHub项目推荐--开源2D 游戏引擎】【转载】

microStudio 是一个可在浏览器中运行的游戏引擎&#xff0c;它拥有一套精美、设计精良、全面的工具&#xff0c;可以非常轻松地帮助你创建 2D 游戏。 你可以在浏览器中访问 microStudio.dev 开始搭建你的游戏&#xff0c;当然你可以克隆现有项目或创建新游戏并开始编码&#x…

城市需求显示在地图上(附MATLAB程序)

我们显示很多城市信息时, 有时候需要把各地人口数量, 各地城市对某种货物的需求量呈现到地图上, 可以用以下代码实现: 程序结果: % 画中国地图 clc;close all;clear all; %%曲面拟合 warning off;%禁止显示警告信息 % load lonlatdata.mat; lonlatdataxlsread(工作簿1.xls,D2…

对于超低延迟SSD,IO调度器已经过时了吗?-part1

此前针对linux IO栈与IO调度器&#xff0c;小编有过基本原理的分析&#xff0c;前文阅读请参考&#xff1a; 《存储IO路径》专题&#xff1a;四种IO栈全能大比武 《存储IO路径》专题&#xff1a;不同IO调度器的差异 近期&#xff0c;小编看到一篇来自University of Louisvil…

Python基础之文件操作(I/O)

和其他编程语言一样&#xff0c;Python 也具有操作文件&#xff08;I/O&#xff09;的能力&#xff0c;比如打开文件、读取和追加数据、插入和删除数据、关闭文件、删除文件等。合理应用python提供的文件操作基本函数&#xff0c;可大大提高自动化实现的效率与框架代码的稳定性…

luffy商城项目(二)

路飞后端配置 二次封装response drf提供的Response对象&#xff0c;不能很方便的加入code和msg字段&#xff0c;自己封装一个Response类&#xff0c;以后都用我们自己封装的&#xff0c;方便咱们写code和msg 封装步骤&#xff1a; 1 在utils/common_response.py from rest_…

基于leaflet地图实现点击点位图标,在图标边上展示信息弹窗的方案

文章标题很直观明显了&#xff0c;所以正文就直入主题。 leaflet组件其实很友好了&#xff0c;基本上能解决大部分网页端地图的大部分常用需求。 现在&#xff0c;要实现点击点位图标&#xff0c;在图标边上展示信息弹窗这个需求。提供两个思路&#xff1a; 1. 利用leaflet自…

v38.Switch语句

1.Switch语句可以替代if-else语句 2.具体使用 Switch&#xff08;expression&#xff09; &#xff5b; case label&#xff1a;...... &#xff5d; ①将x与case后的label 进行比较&#xff1b; ②注意后面有冒号&#xff1b; ③从上往下开始检查case&#xff1b; ④如果…

011 变量

变量的定义 注意事项 作用域 类变量&#xff1a;定义在类中的变量&#xff0c;类的整个生命周期内可用实例变量&#xff1a;定义在类中的变量&#xff0c;类的实例可以使用局部变量&#xff1a;定义在方法中的变量&#xff0c;仅在方法内可以使用 class Dog{// 类变量static …

数据采集与预处理02 :网络爬虫实战

数据采集与预处理02 &#xff1a;网络爬虫实战 爬虫基本知识 1 HTTP的理解 URL uniform resource locator. 是统一资源定位符&#xff0c;URI identifier是统一资源标识符。几乎所有的URI都是URL。 URL前部一般可以看到是HTTP还是HTTPS&#xff0c; 这是访问资源需要的协议…

HelloWorld(java)

1.切换盘符&#xff1a;找到刚刚书写的代码 2.编译&#xff1a;javac是JDK提供的编译工具&#xff0c;通过这个工具&#xff0c;把当前路径下下的HelloWorld.java文件编译成class文件 3.运行&#xff1a;java也是JDK提供的一个工具&#xff0c;作用就是用来运行代码&#xff…

2024.1.23 寒假训练记录(6)

记录一个训练赛踩的大坑&#xff1a;往函数里传vector一定要加引用&#xff01;犯了三次的错误还是记不住&#xff0c;服了&#xff0c;一道题调了一个小时。 文章目录 CF 1490E Accidental VictoryCF 1753B Factorial DivisibilityCF 1454E Number of Simple PathsAT ARC148A …

ImportError: The Qt version imported is 5.9.7 but Matplotlib requires Qt>=5.12

一、错误描述 ImportError: The Qt version imported is 5.9.7 but Matplotlib requires Qt>5.12 在用python中的plt包进行绘图时对plt进行了更新&#xff0c;更新之后再运行以前的代码就出现了这个问题。 二、bug消除 &#xff08;一&#xff09;解决方法——升级pyqt包…

Java面试题之基础篇

文章目录 一&#xff1a;谈谈你对面向对象的理解二&#xff1a;JDK、JRE、JVM三者区别和联系三&#xff1a;和equals比较四&#xff1a;hashCode与equals五&#xff1a;final六&#xff1a;String、StringBuffer、StringBuilder七&#xff1a;重载与重写的区别&#xff1f;八&a…

【云原生】认识docker容器操作命令

目录 一、容器操作命令 1、创建容器 2、删除容器以及停止容器运行 3、查看容器的运行状态 4、查看容器的详细信息 5、将容器的文件传输到宿主机以及将宿主机的文件传输到容器中 6、批量删除容器 7、进入容器 二、容器的迁移 1、先在容器中创建测试文件 2、将容器存储…

永磁同步电机矢量控制原理

永磁同步电机数学模型 永磁同步电机的磁场定向控制