汉诺塔与青蛙跳台阶

1.汉诺塔

根据汉诺塔 - 维基百科 介绍

1.1 背景

最早发明这个问题的人是法国数学家爱德华·卢卡斯。
传说越南河内某间寺院有三根银棒,上串 64 个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世界就会灭亡。这个传说叫做梵天寺之塔问题(Tower of Brahma puzzle)。但不知道是卢卡斯自创的这个传说,还是他受他人启发。
若传说属实,僧侣们需要 (2的64次方-1)步才能完成这个任务;若他们每秒可完成一个盘子的移动,就需要 5849 亿年才能完成。整个宇宙现在也不过 137 亿年。
这个传说有若干变体:寺院换成修道院、僧侣换成修士等等。寺院的地点众说纷纭,其中一说是位于越南的河内,所以被命名为“河内塔”。另外亦有“金盘是创世时所造”、“僧侣们每天移动一盘”之类的背景设定。

1.2 规则与问题

有三根杆子A,B,C。A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:

1.每次只能移动一个圆盘;
2.大盘不能叠在小盘上面。

提示:可将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则。
问:如何移?最少要移动多少次?

思路:为了将A柱中的n个圆盘移动到C柱上去,我们可肯定要先把n-1个圆盘移动到B柱上去,因为只有这样做,我们才能将A柱上最大的圆盘移动到C柱上,所以我们第一个目标就是把A柱上的n-1个圆盘通过C移动到B柱上去。完成这一步后,我们就要把B柱上的(圆盘数-1)移动到C柱上,为了达成目的,是不是就要借助A柱来完成。由此递归的逻辑就清晰了,最后我们就要确定递归的退出条件了,当n == 1时,不需要在减了,这一步的操作已经一目了然了,我们只需要把当前认为A柱上的圆盘数移动到C柱即可。

#include <stdio.h>
void Move(char A,char B,char C,int n)
{if(n == 1){printf("%c->%c\n",A,C);}else{Move(A,C,B,n-1);//把A柱上的n-1个圆盘通过C柱移动到B盘printf("%c->%c\n",A,C);Move(B,A,C,n-1);//把B柱上的n-1个圆盘通过A柱移动到C盘}
}
int main()
{char A = 'A',B = 'B',C = 'C';//定义三个柱分别为A,B,Cint n = 0;scanf("%d",&n);//要移动多少个圆盘Move(A,B,C,n);//return 0;
}
//当n==3时的打印结果
/*
A->C
A->B
C->B
A->C
B->A
B->C
A->C
*/

当n == 3时的效果如图
n==3时的汉诺塔

2.青蛙跳台阶

2.1题目

一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

青蛙跳台阶

2.2递归方法

思路
现在你要跳上第n阶台阶,你会从哪阶台阶跳上去呢,因为青蛙可以跳1阶也可以跳两阶所以为了跳上第n阶,那么青蛙一定来自n-1阶或n-2阶台阶。同理为了跳上n-1阶台阶,青蛙又一定来自n-2或者n-3阶台阶…以此类推,我们就把问题转化成了一个个更小的子问题了。所以这道题目可以使用递归来解决,在写代码前,我们还要确定递归的终止条件,当青蛙为了跳上1阶台阶我们肯定能知道只有一种可能,要跳上2阶台阶有两种可能,一种是从0阶开始跳,一种是先跳到1阶再跳到2阶,这就是递归终止条件。

#include <stdio.h>
int Jump(int n)
{if(n == 1)return 1;if(n == 2)return 2;return Jump(n-1)+Jump(n-2);
}
int main()
{int n = 0;scanf("%d",&n);int ret = Jump(n);
}

2.3 动态规划

不觉得这题和斐波那契数列很像吗?斐波那契数列的公式是f(n) = f(n-1)+f(n-2)(n>2)
这里的公式也是如此,不过不同的是数列的第一个值和第二个值不相同。

#include <stdio.h>int main()
{int n = 0;scanf("%d", &n);int a = 1, b = 2;int c = 2;for (int i = 2; i < n; ++i){c = a + b;a = b;b = c;}printf("%d\n", c);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC(2)——controller方法参数与html表单对应

controller方法参数与html表单对应 0. User实体类 import org.springframework.format.annotation.DateTimeFormat;import java.io.Serializable; import java.util.Date; import java.util.List; import java.util.Map;public class User implements Serializable {private …

ES7210高性能四通道音频ADC转换模拟麦克风为IIS数字咪头

特征 高性能多位 Delta-Σ 音频 ADC 102 dB 信噪比 -85 分贝 THDN 24 位&#xff0c;8 至 100 kHz 采样频率 I2S/PCM 主串行数据端口或从串行数据端口 支持TDM 256/384Fs、USB 12/24 MHz 和其他非标准音频系统时钟 低功耗待机模式 应用 麦克风阵列 智能音箱 远场语音捕获 订购…

微服务的分布式事务解决方案

微服务的分布式事务解决方案 1、分布式事务的理论模型1.1、X/Open 分布式事务模型1.2、两阶段提交协议1.3、三阶段提交协议 2、分布式事务常见解决方案2.1、TCC补偿型方案2.2、基于可靠性消息的最终一致性方案2.3、最大努力通知型方案 3、分布式事务中间件 Seata3.1、AT 模式3.…

人工智能在软件开发中的角色:助手还是取代者?

人工智能在软件开发中的角色&#xff1a;助手还是取代者&#xff1f; 随着科技的飞速发展&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在软件开发领域的应用越来越广泛。从代码生成、错误检测到自动化测试&#xff0c;AI工具正成为开发者的重要助手。然而&#xf…

Postgresql - 用户权限数据库

1、综述 在实际的软件项目开发过程中&#xff0c;用户权限控制可以说是所有运营系统中必不可少的一个重点功能&#xff0c;根据业务的复杂度&#xff0c;设计的时候可深可浅&#xff0c;但无论怎么变化&#xff0c;设计的思路基本都是围绕着用户、部门、角色、菜单这几个部分展…

Django QuerySet对象,filter()方法

filter()方法 用于实现数据过滤功能&#xff0c;相当于sql语句中的where子句。 filter(字段名__exact10) 或 filter(字段名10)类似sql 中的 10 filter(字段名__gt10) 类似SQL中的 >10 filter(price__lt29.99) 类似sql中的 <29.99 filter(字段名__gte10, 字段名__lte20…

程序升级bootloader

文章目录 概述什么是bootloader&#xff1f;为什么用&#xff1f;bootloader启动流程图步骤 下载过程代码获取本地配置信息获取主机传过来的配置信息bootloader发送2给上位机&#xff0c;上位机发送文件给bootloader根据网站复制CRC 烧写flasherase启动编译问题 概述 用keil编…

声明队列和交换机 + 消息转换器

目录 1、声明队列和交换机 方法一&#xff1a;基于Bean的方式声明 方法二&#xff1a;基于Spring注解的方式声明 2、消息转换器 1、声明队列和交换机 方法一&#xff1a;基于Bean的方式声明 注&#xff1a;队列和交换机的声明是放在消费者这边的&#xff0c;这位发送的人他…

Dynamic Web Module facet version问题

The default superclass, "javax.servlet.http.HttpServlet", according to the projects Dynamic Web Module facet version (3.1), was not found on the Java Build Path. 1.右键项目 2.点击Properties 3.点击Java Build Path&#xff0c;右边找到Libraries&…

大模型在营销领域的探索及创新

1 AIGA介绍 2 AIGA在营销领域的 应用和探索 3 总结与展望

java 如何暴露header给前端

在Java中&#xff0c;将HTTP响应的Header暴露给前端通常涉及在Web应用程序的服务器端代码中设置这些Header。这可以通过不同的Java Web框架来实现&#xff0c;比如Spring MVC、JAX-RS&#xff08;Jersey&#xff09;、Servlet等。这里&#xff0c;我将提供一个使用Spring MVC框…

学习笔记——交通安全分析13

目录 前言 当天学习笔记整理 5城市主干道交通安全分析 结束语 前言 #随着上一轮SPSS学习完成之后&#xff0c;本人又开始了新教材《交通安全分析》的学习 #整理过程不易&#xff0c;喜欢UP就点个免费的关注趴 #本期内容接上一期12笔记 当天学习笔记整理 5城市主干道交…

docker-compose Install gitlab 17.1.1

gitlab 前言 GitLab 是一个非常流行的开源 DevOps 平台,用于软件开发项目的整个生命周期管理。它提供了从版本控制、持续集成/持续部署(CI/CD)、项目规划到监控和安全的一系列工具。 前提要求 Linux安装 docker docker-compose 参考Windows 10 ,11 2022 docker docker-c…

多线程爬虫技术详解

&#x1f380;引言❤❤ 在当今信息爆炸的时代&#xff0c;网络爬虫&#xff08;Web Crawler&#xff09;作为一种自动获取网页内容的程序&#xff0c;已经成为数据挖掘和信息检索不可或缺的工具。多线程爬虫作为提高爬虫效率的重要手段&#xff0c;通过并行处理技术大幅度提升…

开发个人Go-ChatGPT--4 用户管理

开发个人Go-ChatGPT–4 用户管理 先看下我的目录结构&#xff0c;可以根据个人爱好&#xff0c;进行重构 |-- Dockerfile |-- LICENSE |-- common | |-- callmodel | | |-- gemma.go | | -- models.go | |-- consts | | |-- code.go | | |-- common.go |…

k8s 部署RuoYi-Vue-Plus之nginx部署

1.挂载存储 可参考 之前文章设置 https://blog.csdn.net/weimeibuqieryu/article/details/140183843 2.部署yaml 先创建命名空间ruoyi, 有就不用创建了 kubectl create namespace ruoyi我暂不需要使用xxjob和Monitor模块, 所以去除了. 有需要再自行添加 需要先启动后端服务…

(ECCV,2022)Mask-CLIP:从CLIP中提取自由密集标签

文章目录 Extract Free Dense Labels from CLIP相关资料摘要引言方法Mask-CLIPMask-CLIP 实验 Extract Free Dense Labels from CLIP 相关资料 代码&#xff1a;https://github.com/chongzhou96/MaskCLIP 论文&#xff1a;https://arxiv.org/abs/2112.01071 摘要 对比语言-…

SprongBoot及其基础应用全套部署脚本和配置

POM.xml配置 </dependencies> <!--skywalking日志监控依赖--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.5.0</version></dependency&g…

修改编译依赖openssl的libcrypto.so

由于centos7默认使用openssl1.0.2k的libcrypto.so.10共享库。即使openssl升级为3.0.11后&#xff0c;编译使用ldd命令查看共享库依旧会引用libcrypto.so.10。 现希望引用libcrypto.so.3&#xff0c;需要在生成动态链接库的CMakeLists.txt中增加如下配置&#xff0c;明确指定ope…

《警世贤文》摘抄:守法篇、惜时篇、修性篇、修身篇、待人篇、防人篇(建议多读书、多看报、少吃零食多睡觉)

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140243440 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…