经典递归 - 汉诺塔问题

简介: 经典递归 - 汉诺塔问题

最近,想复习一下C语言,所以笔者将会在掘金每天更新一篇关于C语言的文章! 各位初学C语言的大一新生,以及想要复习C语言/C++知识的不要错过哦! 夯实基础,慢下来就是快!


汉诺塔问题


百度百科


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


不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时, 假如每秒钟一次,共需多长时间呢?一个平年365天有31536000秒,闰年366天有31622400秒,平均每年31557600秒,计算一下: 18446744073709551615秒


问题分析


A上面放的盘子上面小下面大,借助B盘,将A中的盘子移动到C,移动时要保证B,C的盘子都是上面小下面大,要一个一个盘子移动


image.png


解决方法

解决方法:

1.把A中的n-1个盘子通过C移动到B

2.把A中的剩余的1个盘子移到C

3.把B中的n-1个盘子,通过A移到C 不断递归


代码分析

void move(char pos1, char pos2)
{
  printf("%c->%c ", pos1, pos2);
}
/*
n:要移动的盘子数,
pos1:起始位置
pos2:中转位置
pos3:目的位置
*/
void Hanoi(int n, char pos1, char pos2, char pos3)
{
  if (n == 1)
  {
    move(pos1, pos3); //只有一个盘子,直接从pos1->pos3
  }
  else
  {
    /*(1)以C盘为中介,从A杆将1至n - 1号盘移至B杆;
    (2)将A杆中剩下的第n号盘移至C杆;
    (3)以A杆为中介;从B杆将1至n - 1号盘移至C杆。*/
    Hanoi(n - 1, pos1, pos3, pos2); //以C盘为中介,从A杆将1至n - 1号盘移至B杆
    move(pos1, pos3);//将A杆中剩下的一个盘移至C杆;
    Hanoi(n - 1, pos2, pos1, pos3);//以A杆为中介;从B杆将1至n - 1号盘移至C杆。
  }
}
int main()
{
  Hanoi(3, 'A', 'B', 'C');
  return 0;
}
复制代码

明天将会给大家带来经典下一个经典的递归问题-青蛙跳台阶问题!欢迎大家关注



相关文章
|
Kubernetes 安全 Linux
使用kubeadm快速部署一个k8s集群
使用kubeadm快速部署一个k8s集群
|
资源调度
umi中AssertionError [ERR_ASSERTION]: filePath not found of
umi中AssertionError [ERR_ASSERTION]: filePath not found of
|
机器学习/深度学习 人工智能 自然语言处理
探索AI在自然语言处理中的创新应用
本文旨在揭示人工智能技术如何革新自然语言处理领域。我们将从基础的文本分析到复杂的情感识别,逐步深入探讨AI如何提升语言理解的准确性和效率。文章将通过实际代码示例,展示AI技术在自然语言处理中的应用,并讨论其对日常生活的潜在影响。读者将获得关于AI技术在理解和生成自然语言方面的实用知识,以及如何将这些技术应用于解决现实世界问题的见解。
274 5
|
缓存 监控 数据库
接口性能飞跃:一次成功的优化实践
在软件开发中,接口性能优化是一个永恒的话题。一个高效的接口不仅能提升用户体验,还能减轻服务器压力,降低运营成本。本文将分享一次成功的接口优化案例,从问题诊断到解决方案实施,详细介绍我们的优化过程。
281 0
|
运维 安全 网络安全
自动化运维:使用Python脚本实现批量部署
【8月更文挑战第2天】在现代IT基础设施管理中,自动化运维成为提升效率、减少人为错误的关键。本文将通过一个实际的Python脚本示例,展示如何实现服务器的批量部署,包括环境准备、代码实现及执行过程。文章旨在为运维工程师提供一种简化日常任务的方法,同时强调安全性和可维护性的重要性。
|
存储 小程序 Linux
【Linux从入门到精通】C语言模拟实现进度条小程序
在Linux下,我们安装软件时会经常看到进度条,来告知我们安装的进度。我们不妨自己模拟实现一个进度条,看看其中的细节。模拟实现进度条并不困难,但其中的细节我们又不可忽视。本篇文章会对模拟实现进度条进行详解。
466 1
|
SQL 存储 API
Flink教程(25)- Flink高级特性(FlinkSQL整合Hive)
Flink教程(25)- Flink高级特性(FlinkSQL整合Hive)
1447 0
|
安全 应用服务中间件 Apache
面试题:HTTP长连接在什么时候会超时?
面试题:HTTP长连接在什么时候会超时?
392 0
|
存储 Kubernetes NoSQL
podman pod
podman pod
487 0