首页 > 其他分享 >递归实现青蛙跳台阶问题与汉诺塔问题

递归实现青蛙跳台阶问题与汉诺塔问题

时间:2025-01-19 15:01:20浏览次数:3  
标签:移动 台阶 递归 圆盘 跳到 青蛙 char 汉诺塔 柱上

1.青蛙跳台阶问题

1.1题目描述

一只青蛙一次可以跳1到2阶台阶,问,青蛙跳到第n阶台阶时,有几种跳法?

跳到第1阶台阶时, 有 1种跳法

跳到第2阶台阶时, 有 2种跳法

跳到第n阶台阶时,

从第n-1阶台阶跳1阶台阶到达第n阶台阶,这是方法1

从第n-2阶台阶跳2阶台阶到达第n阶台阶,这是方法2

所以

跳到第n阶台阶的方法总数=

跳到第n-1阶台阶的方法总数 + 跳到第n-2阶台阶的方法总数

值得注意的是

从第n-2阶台阶连续跳两次

,每次跳1阶台阶到达第n阶台阶,这种方法‘3’实际上是方法1的重复

因为方法‘3’是从第n-2阶台阶到第n-1阶台阶,再从第n-1阶台阶跳到第n阶台阶的

该过程的前半部分实现的是到第n-1阶的方法1

后半部分实现的是到第n阶的方法‘1’

所以方法‘3’需要舍去

代码实现

int Fact(int n)
{
	if (n == 1)
		return 1;
	else if (n == 2)
		return 2;
	else return Fact(n - 1) + Fact(n - 2);
}

可以发现,这就是斐波那契 数列的规律

2.汉诺塔问题

有三根柱子和若干个大小不同的圆盘,这些圆盘最初都按照大小顺序穿在源柱上,最大的在最下面,最小的在最上面。目标是将所有这些圆盘移动到目标柱上,同时遵守相应的规则。

规则如下:

  1. 每次只能移动一个圆盘:你不能同时拿起多个圆盘进行移动。

  2. 大盘不能放在小盘上面:在任何时候,较大的圆盘都不能放在较小的圆盘之上。

  3. 只能使用三根柱子:通常称为源柱(起始时所有圆盘都在这里)、目标柱(最终所有圆盘都要移动到这里)和辅助柱(作为移动过程中的临时存放点)。

请问,如何将圆盘从源柱移动到目标柱,同时满足所有规则,并给出最少的移动步骤?

 

最开始我们将 A 柱作为源柱, B柱作为 辅助 柱, C柱作为目标柱

我们需要将A柱上的圆盘 移动到 C 柱上去

当A柱上只有1个圆盘时,我们直接将圆盘从A移动到C

当A柱上有n个圆盘,n大于1时, 我们需要

先将n-1个圆盘,即最大圆盘上面的圆盘,移动到辅助柱B柱上面去,

再将最大的圆盘移动到C柱上去,此时其余的圆盘在B柱上

这时A成为辅助柱,B柱成为源柱,C柱成为目标柱

重复上面的步骤即可

void move(char a, char c)
{
     printf("%c -> %c\n", a, c);
}//书写一个函数打印顺序
void Hanoi(int n, char A, char B, char C)
{
    if(n == 1)
         move(A, C);
    else
    {
//当n大于1时,以C柱为辅助柱,将n-1个圆盘移动到B柱上
      Hanoi(n-1, A, C, B);
//将这时最大的圆盘移动到c柱上
       move(A, C);
//以A柱为辅助柱,将n-1个圆盘移动到C柱上
      Hanoi(n-1,B, A, C);
     }
}
         

解决这个问题的关键是,相信函数能够实现相应的功能

标签:移动,台阶,递归,圆盘,跳到,青蛙,char,汉诺塔,柱上
From: https://blog.csdn.net/zl_dfq/article/details/145241714

相关文章

  • 汉诺塔
    题目:堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小,按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下:首先准备两根柱子,一根A柱串宝塔,一根B柱用于临时叠放。把第1块彩虹圈作为第1座宝塔的基座,在A柱放好。将抓到的下......
  • 1205:汉诺塔问题
    1205:汉诺塔问题http://ybt.ssoier.cn:8088/problem_show.php?pid=1205http://ybt.ssoier.cn:8088/problem_show.php?pid=1205时间限制:1000ms      内存限制:65536KB提交数:58880   通过数: 23313【题目描述】约19世纪末,在欧州的商店中出售一种智力玩具......
  • LCS(递归/记忆化/dp)
    题目链接:https://leetcode.cn/problems/longest-common-subsequence/TLE暴力递归+记忆化版本(基于字符串长度无优化版本)//注意text1[i1-1]==text2[i2-1]classSolution{public:intdp[1000][1000];intlongestCommonSubsequence(stringtext1,stringtext2){......
  • 单词搜索(递归)
    题目链接:https://leetcode.cn/problems/word-search/题意:给定二维char数组,询问是否能够有路径来获得给定的字符数组无法改为动态规划表classSolution{public:boolexist(vector<vector<char>>&board,stringword){intn=board.size();intm=boa......
  • [数据结构学习笔记15] 汉诺塔(Towers of Hanoi)
    汉诺塔是个古老的游戏,它可以用递归来解决。 关于汉诺塔的玩法和介绍,请参考这里。算法思想:1.目标是把最底下,最大的盘从起始柱子移到终点柱子2.那我们要先把除了最大的盘的其他盘子从起始柱子移到临时柱子上3.然后把最大的盘子从起始柱子移到终点柱子4.把除了最大盘的其......
  • 大一计算机的自学总结:二叉树三种序的非递归遍历
    前言二叉树的递归遍历在我上一篇“二叉树及其三种序的递归遍历”里有。其中用到的“BinaryTree”也在链接文章的“二叉树的创建”里。大一计算机的自学总结:二叉树及其三种序的递归遍历而非递归遍历是借助栈的特性,会更难更复杂。TvT......一、先序遍历#include<bits/stdc++.......
  • 递归——用最少的代码完成复杂的运算-函数(中)
    前言:上期我们介绍了函数的概念,库函数,自定义函数等等,这期我们来介绍一下函数的嵌套调用,链式访问,和函数递归。传送门:上一篇文章在这里函数上一,函数的嵌套调用听到函数嵌套不知你是否会想起,条件嵌套,和循环嵌套;条件嵌套:是多个条件语句比如说多个if语句嵌套在一起;循环嵌套:是多......
  • [数据结构学习笔记13] 递归简介(Recursion)
    递归让我们把问题由大分小,小到我们能够轻松处理。递归方法有两个要注意的点:1.递归方法会重复的被调用;2.必须有一个终止条件,否则方法调用不停,会导致stackoverflow。看下面的一个例子,这个没有终止条件,会报错!functionhello(){console.log("I'malittlefunction,shorta......
  • 在那些场景下可能会用到递归?递归的缺点?
    一、递归的应用场景(一)树形结构相关问题文件系统遍历在计算机的文件系统中,目录和文件构成了一棵树。例如,一个根目录下有多个子目录,每个子目录又可以包含更多的子目录和文件。递归可以很好地遍历这种结构。以遍历一个文件夹中的所有文件为例,算法可以先处理根目录下的文件,然后对每......
  • 【轻松掌握数据结构与算法】递归与回溯:解决复杂问题的利器
    在数据结构与算法的世界中,递归和回溯是两种强大的技术,它们可以帮助我们解决许多看似复杂的问题。本文将详细介绍递归和回溯的基本概念、应用场景以及它们的实现方法,并通过示例和图表来帮助你更好地理解这些概念。递归:自我调用的力量递归是一种函数调用自身的技术。它允许我......