函数的递归调用举例之汉诺塔问题模型

简介: 汉诺塔(Tower of Hanoi)问题模型

前言:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

正文

汉诺塔(Tower of Hanoi)问题模型:

假设有n个盘子,大盘在下,小盘在上。要求将所有盘子由A杆移动到C杆,可以借助B杆,但移动时必须满足以下要求:

(1)每次只能移动1个盘子;

(2)移动过程中,每个杆上的盘子必须保证大盘在下,小盘在上

image.gif编辑              image.gif编辑

汉诺塔玩具模型                                                    由4个圆盘构成的汉诺塔移动步骤

由3个盘子移动图解:

image.gif编辑

image.gif编辑

image.gif编辑

image.gif编辑

 综合可得到移动3个盘子的步骤为: ① A→C,A→B,C→B, ② A→C, ③ B→A,B→C,A→C。 共经历7步。

由此可推出: 移动n个盘子要经历(2n-1)步。

先分析A杆上3个盘子移到C杆上的过程:

① 将A杆上2个盘子移到B杆上(借助C杆)。

② 将A杆上1个盘子移到C杆上。

③ 将B杆上2个盘子移到C杆上(借助A杆)。 其中②可直接实现。①可递归分解为: 将A杆上1个盘子从A杆移到C杆; 将A杆上1个盘子从A杆移到B杆; 将C杆上1个盘子从C杆移到B杆。 第③步可以分解为: 将B杆上1个盘子从B杆移到A杆上; 将B杆上1个盘子从B杆移到C杆上; 将A杆上1个盘子从A杆移到C杆上。

分析可得:n个盘子(n>1)时,若将其从A杆上移至C杆上,需要借助B杆,可以分三步:

(1)将A最上面的n-1个盘子借助C移到B上,即Hn-1次;

(2)将A最下面的一个盘子移到C上,一次就好;

(3)将B上面的n-1个盘子借助A移到C上,即Hn-1次。        

很显然,汉诺塔问题是一个递归问题,可以编写递归函数来实现。

当n>1时,移动盘子的递归过程就是上述三个步骤;递归终止条件就是当n=1时,直接将盘子从A杆移至C杆即可。

汉诺塔问题程序如下:
#include <stdio.h>
void  main()
{ int nd;
  void hanoi(int,char,char,char); 
  printf("input the number of disks:");
  scanf("%d",&nd);
  printf("the step to moving %2d disks:\n",nd);
  hanoi(nd,'A','B','C'); 
}
void hanoi(int n,char a,char b,char c)
{ if(n==1)
    printf("%c-->%c\n",a,c); 
  else
  { hanoi(n-1,a,c,b);     
    printf("%c-->%c\n",a,c); 
    hanoi(n-1,b,a,c); 
  }
}

image.gif

运行结果:

image.gif编辑

注:函数的功能是按要求移动盘子,无需返回值,是void类型。函数的参数有4个,一个是盘子数n,另外三个是代表盘杆的字符变量a,b和c。

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

相关文章
|
关系型数据库 MySQL 数据挖掘
MYSQL日期与时间函数的实用技巧
MYSQL日期函数与时间函数是数据库操作的关键工具,可轻松处理、查询、比较和格式化日期时间数据。它们能提取日期的年、月、日等部分,便于筛选和统计;同时,也能处理时间数据,如计算时间差、获取当前时间,助力用户更好地管理时间信息。掌握这些函数,不仅能提升数据库操作效率,还能为数据分析和报表生成提供有力支持。无论初学者还是资深数据库管理员,精通MYSQL的日期和时间函数都至关重要,以满足各种数据处理需求,确保数据的准确性和高效性。
794 0
|
数据采集
JSoup 爬虫遇到的 404 错误解决方案
JSoup 爬虫遇到的 404 错误解决方案
|
12月前
|
数据采集 人工智能 移动开发
盘点人工智能在医疗诊断领域的应用
人工智能在医疗诊断领域的应用广泛,包括医学影像诊断、疾病预测与风险评估、病理诊断、药物研发、医疗机器人、远程医疗诊断和智能辅助诊断系统等。这些应用提高了诊断的准确性和效率,改善了患者的治疗效果和生活质量。然而,数据质量和安全性、AI系统的透明度等问题仍需关注和解决。
1423 10
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
885 3
|
传感器 人工智能 物联网
【C 言专栏】C 语言与硬件交互的方法
【5月更文挑战第4天】C 语言在硬件交互中扮演关键角色,主要通过直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射I/O和设备驱动程序开发。挑战包括硬件多样性、实时性要求和错误处理。随着物联网和人工智能发展,C语言与硬件交互的需求增加,未来将面临更多新硬件和技术的挑战。本文旨在帮助读者理解和掌握这一领域的知识,以实现更高效的硬件互动。
433 1
【C 言专栏】C 语言与硬件交互的方法
|
运维 监控 Shell
自动化运维之宝:编写高效的Shell脚本
【8月更文挑战第31天】在运维的世界里,Shell脚本是一把瑞士军刀,它让日常任务变得简单而高效。本文将通过浅显易懂的语言和实际案例,带你领略Shell脚本的魅力,并教你如何打造属于自己的自动化工具箱。无论你是初学者还是资深运维,这篇文章都将为你打开一扇窗,让你看到不一样的风景。让我们一起探索Shell脚本的世界吧!
|
Ubuntu Linux C语言
【opencv】opencv在windows和linux的应用
【opencv】opencv在windows和linux的应用
|
算法
递归函数实现素数判断
该文介绍了素数判断的递归实现,尽管递归算法在判断素数上并不高效,时间复杂度和空间复杂度均为O(N),但作为学习和理解递归的一种方式,仍有其价值。文章强调在实际应用中应选择更高效的方法。递归思路基于试除法,对于大于1的整数,如果只能被1和自身整除,则为素数。递归函数通过不断试除2到根号下该数之间的数来判断,同时注意到偶数不是素数。文中给出了非递归和递归的试除法代码示例。
319 2
|
XML 存储 分布式数据库
数据库主流技术
数据库主流技术
347 4
|
C++ 索引
C++ 获取数组大小、多维数组操作详解
本文介绍了如何获取数组的大小和使用`sizeof()`运算符。`sizeof()`返回数组所占字节数,而非元素个数。要获取元素个数,需除以单个元素的大小。此外,文章展示了如何使用`sizeof()`遍历数组,包括多维数组。多维数组是数组的数组,可用来表示网格。文中以战舰游戏为例说明了多维数组的应用。最后提到了微信公众号`Let us Coding`以获取更多内容。
452 0