汉诺塔问题

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

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


在函数递归中,有一个非常经典的问题——汉诺塔问题。接下来我将介绍一下这个经典案例。


我们先来规定一下三个柱子分别为a,b,c柱,当我们在a柱上有一个圆盘时,只需将a柱上的圆盘移动到c柱上即可完成。那有两个圆盘时,我们先将第一个圆盘放到b柱上再将第二个圆盘放到c柱上,最后将在b柱上的小圆盘放到c柱上即可完成,一共用三步。


那我们以此类推,现在有n个圆盘在a柱上,我们只需要使用上面所述的方法,将n-1个圆盘看作一个整体,把n-1个圆盘先挪到b柱上再将第n个圆盘挪到c柱上,最后将n-1个圆盘在挪到c柱上即可完成。


那当我们考虑如何将n-1个盘子挪到b柱上时,我们不妨将n-2个圆盘看成整体,一起挪到b柱上去。以此类推,就可以求出n个圆盘挪到c柱上去的步数。


这个问题就可以用函数的递归非常巧妙的解决。下面就进行实际操作。


#include<stdio.h>
int sum = 0;
void hanoi(int n, char x, char y, char z)
{
  if (n == 1)
  {
    printf("%c-->%c\n", x, z);
    sum++;
  }
  else
  {
    hanoi(n - 1, x, z, y);//把n-1的盘子从a柱通过c柱移到b柱
    printf("%c-->%c\n", x, z);//将a柱的第n个盘子移到c柱
    sum++;
    hanoi(n - 1, y, x, z);//把n-1的盘子从b柱通过a柱移到c柱
  }
}
int main(void)
{
  int n;
  printf("Please input n:");
  scanf("%d", &n);
  hanoi(n, 'a', 'b', 'c');
  printf("%d\n", sum);
  return 0;
}


我们创建hanoi函数,给予函数四个形参,分别为盘子的个数,以及a,b,c三个柱子。当进入函数体后,先判断圆盘个数是否为1,如果不是将进入else部分。先将n-1的圆盘从a柱经过c柱移动到b柱上,进行第一个递归,当第一步完成后,然后将第n个圆盘从a柱移到c柱上去。最后在将n-1圆盘从b柱通过a柱移动到c柱上,进行第二次递归,最终完成汉诺塔游戏。这个问题的难点就在于要分两部完成,使用两次递归。


ad998e060d9649caa349c40907adbf14.png


当我们有三个圆盘时,我们使用七步即可完成这个问题。函数的调用分析如下:


1e2015732a5d45609fd031da7bf5ebd3.png


从第一步到最后一步,这张图分析了两次递归的顺序以及函数形参的变化,更好的帮助我们理解了两次递归的意义。


函数递归可以有效巧妙的解决一些步骤相似且复杂的问题,让复杂问题简单化,大事化小。

目录
相关文章
|
3月前
|
数据安全/隐私保护 计算机视觉 iOS开发
拼多多订单截图生成器,拼多多订单p图软件,python版本
这段代码实现了一个完整的拼多多订单截图生成器,包含了订单数据生成、图像处理和二维码生成等功能
|
存储 Java 调度
技术笔记:quartz(从原理到应用)详解篇(转)
技术笔记:quartz(从原理到应用)详解篇(转)
|
12月前
|
存储 人工智能 项目管理
效率翻倍!支持多人在线协作的协同工具
在数字化时代,团队协作的效率成为企业发展的重要驱动力。在线协同工具如板栗看板、Notion、Quip 和 Google Docs 等,通过实时共享信息、高效沟通和多功能集成,帮助团队成员跨越时间和空间限制,实现高效协作。这些工具不仅提升了项目管理的透明度和效率,还降低了沟通成本,适用于从项目管理到个人任务管理的多种场景。
效率翻倍!支持多人在线协作的协同工具
|
5月前
|
人工智能 弹性计算 运维
阿里云邀请您参加 2025 中国 Serverless 用户调查
阿里云邀请您参加 2025 中国 Serverless 用户调查
|
12月前
|
存储 Rust 搜索推荐
KaOS Linux 2024.09 发布
【10月更文挑战第6天】
241 2
KaOS Linux 2024.09 发布
|
11月前
|
安全 搜索推荐 网络安全
Windows操作系统的演变与未来趋势####
本文将深入探讨Windows操作系统从诞生至今的发展历程,分析其关键版本的技术创新、市场影响及用户反馈。同时,结合当前科技趋势,预测Windows系统的未来发展方向,包括智能化、云集成、安全性提升等方面的可能性。 ####
|
数据可视化 搜索推荐 Devops
从DevOps实践者的角度谈谈云效Flow
一名DevOps实践者参与了云效流水线Flow的评测,认为Flow对新手友好,具有可视化编排功能。但在上手过程中,了解相关术语和流畅编排设计可能构成一些挑战。Flow的功能基本满足需求,但开放性有待提高,建议开放插件开发以丰富生态。YAML编排作为趋势,Flow在易用性和功能完善上仍有进步空间,如语法检查、智能提示等功能。此外,产品模块间的逻辑性和交互清晰度也需改进。总结来说,Flow功能齐全,适合中小企业,但在用户体验和生态建设上有改进余地。
558 3
|
12月前
|
存储 编解码 UED
网站图片JPG、PNG、GIF哪个好,该选择谁
网站图片JPG、PNG、GIF哪个好,该选择谁
581 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue的个人理财系统的设计与实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的个人理财系统的设计与实现(源码+lw+部署文档+讲解等)
228 1
|
存储
软件设计师软考题目解析17 --每日五题
这篇文章提供了软件设计师软考的每日五题解析,包括页面变换、段页式存储管理、可变式分区分配、虚拟页式存储管理和I/O接口编址等计算机系统相关题目。
359 0