C语言递归问题【青蛙跳台阶】和【汉诺塔】
青蛙跳台阶
题目要求:一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法?
分析:
当n为1时,有1种方法;
当n为2时,有2种方法;
当n为3时,有3种方法;
当n为4时,有5种方法;
当n为5时,有8种方法;
当n为6时,有13种方法;
当n为7时,有21种方法;
|n| sum|
|-1-|-1-|
| 2 |2
3 |3
4 |5
5 |8
6 |13
7 |21
这个数列为:1,2,3,5,8,…
我们不难发现:第n次的跳法数为第n-1次和第n-2次之和
规律如下:
f(n)=f(n-1)+f(n-2)
具体实现如下:
#include<stdio.h>
int sum(int n)
{if (n <= 2){return n;}elsereturn sum(n - 1) + sum(n - 2);
}
int main()
{int n = 0;printf("请输入总的台阶数:");scanf("%d", &n);int ret = sum(n);printf("一共有%d种方法 ", ret);return 0;
}
//上述方法如果值过大时,会造成很大的浪费的情况,做了很多重复的计算,大家可以试试!
汉诺塔
**定义:**汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
那么我们把n个盘子从A柱移动至C柱的问题可以表示为:
Hanio(n,A,B,C);
那么从上面的分析得出:
该问题可以分解成以下子问题:
第一步:将n-1个盘子从A柱移动至B柱(借助C柱为过渡柱)
第二步:将A柱底下最大的盘子移动至C柱
第三步:将B柱的n-1个盘子移至C柱(借助A柱为过渡柱)
分析:
1.当n = 1的时候,这时只有一个个盘子,那么直接将其移动至C就可以,移动过程为: A -> C
2.当n = 2的时候,这时候有两个盘子,那么在一开始移动的时候,我们需要借助B柱作为过渡的柱子,即将A柱最上面的那个小圆盘移至B柱,然后将A柱底下的圆盘移至C柱,最后将B柱的圆盘移至C柱。完整移动过程为:A -> B , A -> C , B -> C
3.当n>2时,我们可以大概分为三部分来理解这个过程:
①.把n上面的所有圆盘移动到B柱,C作为辅助,此时A是起始柱,B是目标柱,C只是作为辅助柱
②.把最大的圆盘n直接从A移动到C柱
③.把B柱上的圆盘全部移到C柱,A作为辅助,此时B是起始柱,C是目标柱,A只是作为辅助柱
代码如下:
void hanoi(int n, char a, char b, char c) {if (1 == n){printf("\t%c--->>%c\n", a, c);}else{hanoi(n-1, a, c, b);printf("\t%c---->>%c\n", a, c);hanoi(n-1, b, a, c);}
}
int main()
{int n = 0;printf("请输入数字:");scanf("%d", &n);hanoi(n, 'A', 'B', 'C');return 0;
}
总结:这两个问题相对来说有点抽象,希望小伙伴们多想想不懂的话!
最后,大家一定要上手操作才行哟!
C语言递归问题【青蛙跳台阶】和【汉诺塔】相关推荐
- C语言 - 递归之青蛙跳台阶详解(这货就是个斐波那契数列)
什么是青蛙跳台阶问题? 一只青蛙可以一次跳 1 级台阶或一次跳 2 级台阶,如果台阶数为n,那么这只青蛙有多少种跳法? 电影<少年班>中有这样一个片段,导师周知庸寻找智力超群的少年时遇到了 ...
- 【Java数据结构与算法】第十七章 二分查找(非递归)和分治算法(汉诺塔)
第十七章 二分查找(非递归)和分治算法(汉诺塔) 文章目录 第十七章 二分查找(非递归)和分治算法(汉诺塔) 一.二分查找 1.思路 2.代码实现 二.分治算法(汉诺塔) 1.概述 2.汉诺塔 一.二 ...
- 你是真的“C”——详解函数递归+求解青蛙跳台阶问题
详解函数递归运用+求解青蛙跳台阶问题
- c语言程序代码应缩进几格,汉诺塔c语言程序代码
汉诺塔c语言程序代码(通过vc++6.0验证)(附讲解) 让我们先看看代码吧 #include int hj(int a,int b, int c,int i) { int t; if(i==1) p ...
- 【Python】函数递归实例之字符串反转、汉诺塔问题分析
递归的定义 函数定义中调用函数自身的方式 两个特性: 链条:计算过程存在递归链条 例如,n!=n*(n-1)!,n!与(n-1)!就构成了递归链条 基例:基础的实例,存在一个或多个不需要再次递归的基例 ...
- 递归:这帮小兔子崽子、汉诺塔游戏+习题复习
##坑爹的兔子 ##斐波那契数列的迭代实现 ※我们都知道兔子繁殖能力是惊人的,如下图: ※我们可以用数学函数来定义: ※课间练习:假设 ...
- 汉诺塔递归python搬运次数_Python3.x | 汉诺塔递归理解
在刚学廖雪峰廖大佬的python3教程中的递归时,前面的内容理解都觉得还行,到了做汉诺塔的练习时会觉得有些发懵,后面多看几遍和练习后也就理解了. 因为遇到有人在问这个问题咋理解,因此写下我的想法,希望 ...
- 递归_青蛙跳台阶(进阶版)
Hello_xzy_Word 2020-03-29 20:06:04 260 收藏 1 分类专栏: 在线编程 版权 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该 ...
- 青蛙跳台阶c语言递归函数,【递归】青蛙跳台阶问题
题目描述: 思路一:递归 此类求多少种可能性的题目一般都有递推性质 ,即 f(n)和 f(n−1)-f(1) 之间是有联系的 f(0)=1 f(1)=1 f(2)=2 f(3)=3 f(4)=5 .. ...
- 青蛙为什么要跳台阶,C语言趣解青蛙跳台阶问题
⭐️前面的话⭐️
最新文章
- Zenoss Announces Monitoring for VMWare's Cloud Director
- Ubuntu Snap 简述
- Linux 段错误详解
- 学习webpack(二)
- 正则表达式过滤HTML危险脚本
- Linux下C/C++开发工具注意事项
- 线段树 + 矩阵 --- ZOJ 3772 Calculate the Function
- MVC + AJAX请求失败的问题
- JavaWeb --第四章Maven详解
- jaxb解析字符串xml_一个JAXB Nuance:字符串与枚举(受限制的XSD字符串)的枚举
- android系统签名app自动更新,【Android 进阶】Apk 使用系统签名
- java 数组的索引_java如何寻找数组中心索引
- 图形推理1000题及答案解析_判断推理图形推理——区分旋转翻转
- 设置背景图片的两种方式,并解决手机端背景图片高度自适应问题
- 解决element-ui的el-select组件文字超过宽度时不出现横向滚动条问题
- 某一年某一年_链接一年
- 大数据分析,主要运用了哪些关键技术?
- 微信上传图片没反应_365微信编辑器图片上传不了怎么办?
- XiaoZi's CrackMe
- javaSE(71-148)
热门文章
- 汽车云智能采集服务 八爪鱼采集器在汽车行业网站的应用
- 永磁同步电机驱动器保护算法专题
- 【PC工具】更新微信语音转mp3保存备份方法及工具,微信语音备份方法,silk转mp3工具...
- 【优化算法】改进的侏儒猫鼬优化算法(IDMO)【含Matlab源码 2314期】
- python 多态 知乎_Python鸭子类型和多态
- 怎么提高国外服务器速度?
- 属性基加密仿真及代码实现(CP-ABE)论文:Ciphertext-Policy Attribute-Based Encryption
- 五星好评的蓝牙耳机长什么样子?2021高人气蓝牙耳机榜单前五
- 9本4月程序员新书,Python书就占了6本
- 三只松鼠3次方新品魅力何在?