汉诺塔(hanio)--C语言函数递归

news/2024/11/23 13:43:55/

文章目录

  • 前言
  • 一、汉诺塔的图解
  • 二、问题分析
  • 总结


前言

什么是汉诺塔?

   汉诺塔(Tower of Hanoi)(也称河内塔)是有法国数学家爱德华·卢卡斯于1883年发明的一道智力题。它源于印度的一个古老传说:大梵天创造世界的时候做了三根钻石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令一组牧师把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。据说牧师们夜以继日地工作,当他们完成任务时,那座塔就将坍塌,世界也将毁灭。


一、汉诺塔的图解

设有三个柱子,要把三个盘子从A柱移动到C柱,我们应如何解决呢?

先分步走,当盘子个数为1时,走一步,只需要把盘子从A柱直接挪到C柱(A--->C),如图所示:

当盘子个数为2时,要走三步,先把上面的盘子从A柱挪到B柱(A--->B),再把下面的盘子从A柱挪到C柱(A--->C),最后把B柱上的盘子挪到C柱(B--->C),如图所示:

当盘子个数为3时,要走七步,A--->C;A--->B;C--->B;A--->C;B--->A;B--->C;A--->C   如图所示:

经过上面的步骤,我们会发现移动盘子的次数是指数增长,要移动2^n-1次。

二、问题分析

经过上面的图解发现,设我们要移动n个盘子,当n=1时,只需要把盘子从A柱(起始位置)移到C柱(目的位置);当n>1时,需要把A柱上n-1个盘子先借助C柱(目的位置)再移到B柱(中转位置)上,A柱上剩下的一个盘子直接移到C柱,再把B柱上n-1个盘子移到C柱上,从而完成n个盘子从A柱到C柱的移动。

首先实现能打印从起始位置到目的位置的过程的函数:

void move(char pos1, char pos2)
{printf("%c->%c\n", pos1, pos2);
}

实现汉诺塔函数:

我们可以表示为3个步骤:
1. 将n-1个盘子由A 移到 B;

2.将第n个盘子由 A移到 C;

3.将n-1个盘子由B 移到 C;

n:代表盘子的个数;pos1:起始位置;pos2:中转位置;pos3:目的位置

//        盘子个数   起始      中转       目的
void hanio(int n, char pos1, char pos2, char pos3)
{if (n == 1){move(pos1, pos3);//移动过程}else//大化小的过程{hanio(n - 1, pos1, pos3, pos2);move(pos1, pos3);hanio(n - 1, pos2, pos1, pos3);}
}

实现完整的代码:

#include <stdio.h>void move(char pos1, char pos2)
{printf("%c->%c\n", pos1, pos2);
}//        盘子个数   起始      中转       目的
void Hanio(int n, char pos1, char pos2, char pos3)
{if (n == 1){move(pos1, pos3);//移动过程}else{Hanio(n - 1, pos1, pos3, pos2);//从起始位置到中转位置再到目的位置move(pos1, pos3);Hanio(n - 1, pos2, pos1, pos3);}
}int main()
{int n = 0;char A = 'A';char B = 'B';char C = 'C';printf("请输入要移动盘子的个数>:\n");scanf("%d", &n);Hanio(n, A, B, C);return 0;
}

运行结果:


总结

非常感谢大家阅读完这篇博客。希望这篇文章能够为您带来一些有价值的信息和启示。


http://www.ppmy.cn/news/1549296.html

相关文章

提升软件测试报告的质量:Allure2中添加用例失败截图、日志、HTML块和视频的方法

Allure2的用途 Allure2是一个用于生成测试报告的框架&#xff0c;广泛应用于自动化测试和手动测试中。它支持多种测试框架&#xff0c;如JUnit、TestNG、MSTest等&#xff0c;通过生动的图表和详细的日志&#xff0c;使得非技术人员也能轻松地理解测试结果。许多团队选用Allur…

对 TypeScript 中函数如何更好的理解及使用?与 JavaScript 函数有哪些区别?

TypeScript 中函数的理解 在 TypeScript 中&#xff0c;函数本质上与 JavaScript 中的函数类似&#xff0c;但是它增强了类型系统的支持&#xff0c;使得我们可以对函数的参数和返回值进行更严格的类型检查。这样可以有效减少类型错误&#xff0c;提高代码的可维护性和可读性。…

第十章 JavaScript的应用

10.1 JavaScript概述 10.1.1 JavaScript简介 JavaScript是一种基于对象&#xff08;Object&#xff09;和事件驱动&#xff08;Event Driven&#xff09;并具有安全性能的脚本语言&#xff0c;能够与HTML&#xff08;超文本标记语言&#xff09;、Java语言一起在 Web 页面中与W…

MySQL初学之旅(4)表的设计

目录 1.前言 2.正文 2.1第一范式 2.2第二范式 2.3第三范式 2.4表的设计方法 3.小结 1.前言 哈喽大家好吖&#xff0c;今天继续给大家分享MySQL的学习——表的设计&#xff0c;这一部分没有太多语法的讲解&#xff0c;有许多设计思路以及规则的讲解与剖析&#xff0c;那…

《线性代数的本质》

之前收藏的一门课&#xff0c;刚好期末复习&#xff0c;顺便看一看哈哈 课程链接&#xff1a;【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量&#xff0c;需要先明白什么是向量 不同专业对向量的看法 物理专…

百度遭初创企业指控抄袭,维权还是碰瓷?

“ 抄袭指控引发网友热议&#xff0c;有人支持其立场&#xff0c;也有人认为工具类产品在界面设计上相似度高是行业常态。 ” 转载|科技新知 原创 作者丨晓伊 编辑丨蕨影 一年一度的百度世界大会刚刚落幕&#xff0c;一家初创企业却站出来公开指责百度抄袭自家产品&#xff…

【虚幻引擎】UE5数字人开发实战教程

本套课程将会交大家如何去开发属于自己的数字人&#xff0c;包含大模型接入&#xff0c;流式输出&#xff0c;语音识别&#xff0c;语音合成&#xff0c;口型驱动&#xff0c;动画蓝图&#xff0c;语音唤醒等功能。 课程介绍视频如下&#xff1a; 【虚幻引擎】UE5 历时一个多月…

【海思Hi3519DV500】双目网络相机套板硬件规划方案

Hi3519DV500双目网络相机套板是针对该芯片设计的一款 IP 编码板 PCBA&#xff0c;硬件接口支持双目sensor 接入&#xff0c;SDIO3.0 接口、USB2.0、USB3.0、UART 接口以及丰富的 IO 扩展应用&#xff0c;可根据各种使用场景设计相应扩展板&#xff0c;丰富外围接口&#xff0c;…