当前位置: 首页 > article >正文

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

文章目录

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


前言

什么是汉诺塔?

   汉诺塔(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.kler.cn/a/402582.html

相关文章:

  • 中班幼儿户外运动游戏活动现状及策略研究
  • CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes
  • LSA1类和2类区别
  • 基于AXI PCIE IP的FPGA PCIE卡示意图
  • 基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码
  • 学习python的第十三天之函数——函数的返回值
  • 【提效工具开发】管理Python脚本执行系统实现页面展示
  • Android Studio启动模拟器显示超时
  • 基于BindingList的WinForm数据绑定机制与DataGridView动态刷新技术
  • Layui的select控件的onchange事件 无效的解决方法
  • MySQL库和表的操作
  • Spark RDD sortBy算子执行时进行数据 “采样”是什么意思?
  • 电脑超频是什么意思?超频的好处和坏处
  • Java小白成长记(创作笔记一)
  • Agent AI:智能代理AI:多模态交互视野的探究
  • Docker 数据卷 和 挂载 的区别
  • python脚本实现csv中百度经纬度转84经纬度
  • 高级网络安全——WEP, WPA(week6)
  • Android Glide load origin Bitmap, Kotlin
  • 【优选算法篇】分治乾坤,万物归一:在重组中窥见无声的秩序
  • 深度学习三大框架对比与实战:PyTorch、TensorFlow 和 Keras 全面解析
  • Android开发实战班 - 应用架构 之 Kotlin 协程基础
  • 【实用技能】使用 TX Text Control 创建带有嵌入式附件的 PDF 文档
  • 从零开始的c++之旅——map_set的使用
  • 如何对AWS进行节省
  • OpenCvSharp Demo 饱和度、明度、对比度、锐化、阴影、高光、色温实现滤镜效果