利用函数递归求汉诺塔问题

简介: 利用函数递归求汉诺塔问题

1.汉诺塔问题的由来

       (感谢chatgpt)汉诺塔,又称河内塔,是一种传统的益智玩具和数学问题。据说其起源可以追溯到印度古代传说中的 Brahma 寺庙,从印度传播到东南亚、中国等地区。最早的正式记载出现在 19 世纪末的法国数学家 Edouard Lucas 发表于《科学》杂志上的一篇文章中。

       故事的情节大致是这样的:在 Brahma 所供奉的圆锥形塔庙里,有三根钉子,最初所有的圆盘都串在其中一根钉子上,大的在下,小的在上,形成一个由大到小的递减序列;路过此处的人们想试一下自己的本领,就开始实行“移魂换魄”的任务。用任何一根钉子作为中介,只允许在小盘子上面放大盘子,在三根钉子之间移动。目标是尽快完成把所有圆盘从初始位置移到某个其他钉子上的操作。如果能在数量较少的步骤中完成,則壓力減小,而如果得不出答案则不礼也不会武变態了!

       汉诺塔问题引入后在数学界得到了广泛的关注和研究。除了其本身作为益智游戏之外,汉诺塔问题在计算复杂度、基于规则的机器学习等领域都具有重要的意义。汉诺塔问题也被用来解释人类思维能力中的归纳、递推等抽象概念,成为了教育多尚方宝剑。

画图理解:

 

2.汉诺塔问题的求解(关于移动步数)

图片理解:

 

#include <stdio.h>
//汉诺塔问题(利用函数递归实现)
//函数定义部分
static int count = 1;
int hannuo(int n)
{
  if (n > 1)
  {
    count = count * 2 + 1;
    hannuo(n - 1);
  }
  else
    return count;
  return count;
}
int main()
{
  int n;
  printf("请输入圆盘个数:");
  scanf("%d",&n);
  int step = hannuo(n);
  printf("完成步骤为:%d步\n", step);
  return 0;
}

3.如何打印移动路径

//汉诺塔移动步骤
//定义move函数,来打印路径
void move(char s, char d)
{
  printf("%c -> %c \n", s, d);
}
//pos1:起始位置
//pos2:中转位置
//pos3:终点位置
void hannuo(int n, char pos1, char pos2, char pos3)
{
  if (1 == n)//如果只有一个盘子,直接移动即可
  {
    move(pos1, pos3);
  }
  else//多于一个盘子,用大事化小的思维
  {   
    hannuo(n - 1, pos1, pos3, pos2);//先将最大盘子之上的n-1个盘子经过c,转移到b上
    move(pos1, pos3);//再将最大的盘子转移到c,
    hannuo(n - 1, pos2, pos1, pos3);//最后将b上的n-1个盘子经a的中转转移到c上
  }
}
int main()
{
  int n;
  printf("请输入盘子的个数n:");
  scanf("%d", &n);
  //定义三个盘子分别为'A', 'B', 'C'
  hannuo(n, 'A', 'B', 'C');
  return 0;
}

4.总结:

       汉诺塔问题体现了数学思想中的递归,所谓递归,在笔者看来,就是求解拥有大量重复步骤问题的求解,最重要的思维是“大事化小”,将复杂的问题一步步拆分,化繁为简!

目录
相关文章
|
JavaScript 内存技术
fnm 安装、卸载与使用(详细步骤)
fnm 安装、卸载与使用(详细步骤)
3098 0
|
SQL JSON 数据可视化
新的一年,带给你全新的DataV
2023已经到来,我们正在迎来春暖花开的新时节。在这新年到来之际,我们给广大的DataV用户带来了一份新年礼物 - 全新的DataV 7.0版本,下面小编就带大家看一看新版本中有哪些激动人心的升级。
新的一年,带给你全新的DataV
|
Java Spring
Spring Boot3整合knife4j(swagger3)
Spring Boot3整合knife4j(swagger3)
2845 1
|
10月前
|
Linux iOS开发 异构计算
Ollama完成本地模型的运行
# Ollama完成本地模型的运行
3182 8
Ollama完成本地模型的运行
|
前端开发 JavaScript
【项目笔记】:elementui下拉框数据太多造成页面卡顿怎么解决?
针对前端下拉框数据过多造成页面卡顿,元芳你怎么看?
591 2
|
关系型数据库 MySQL Java
通过使用阿里云服务器,搭建Java程序的运行环境
通过使用阿里云服务器,搭建Java程序的运行环境
520 0
|
机器学习/深度学习 人工智能 自然语言处理
prompt 原理
【8月更文挑战第5】
251 4
|
边缘计算 安全 物联网
边缘计算在物联网中的作用:技术深度解析
【7月更文挑战第28天】边缘计算在物联网中发挥着至关重要的作用。通过降低延迟、减少网络负载、提高隐私和安全性以及增强离线功能等优势,边缘计算为物联网带来了更加高效、智能和安全的解决方案。未来随着技术的不断进步和应用场景的拓展,边缘计算将在物联网领域发挥更加重要的作用
|
监控 前端开发 Java
Spring Boot中的拦截器配置
Spring Boot中的拦截器配置
|
机器学习/深度学习 分布式计算 监控
面经:MapReduce编程模型与优化策略详解
【4月更文挑战第10天】本文是关于MapReduce在大数据处理中的关键作用的博客摘要。作者分享了面试经验,强调了MapReduce的基本原理、Hadoop API、优化策略和应用场景。MapReduce包含Map和Reduce两个主要阶段,Map阶段处理输入数据生成中间键值对,Reduce阶段进行聚合计算。面试重点包括理解MapReduce工作流程、使用Hadoop API编写Map/Reduce函数、选择优化策略(如分区、Combiner和序列化)以及应用场景,如日志分析和机器学习。
299 2