青蛙跳台

  • 一、问题描述:
  • 二、问题分析:
  • 三、代码实现:
    • 1、递归实现:
    • 2、非递归实现:
  • 四、问题进阶:
    • 1、问题分析:
    • 2、代码实现:

一、问题描述:

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

二、问题分析:

当n=1时,有一种跳法:
1、跳1级。
当n=2时,有两种跳法:
1、跳1级,跳1级。
2、跳2级。
当n=3时,有三种跳法:
1、跳1级,跳1级,跳1级。
2、跳1级,跳2级。
3、跳2级,跳1级。

我们可以将n级台阶时的跳法看成是n的函数f(n)。
当n>2时,青蛙跳第一步有两种选择(跳1级或者跳2级):
1、第一步跳1级。剩下n-1级有f(n-1)中跳法。
2、第一步跳2级。剩下n-2级有f(n-2)中跳法。
所以n个台阶时有f(n)=f(n-1)+f(n-2)种跳法。

三、代码实现:

1、递归实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int FrogJump(int n){if (n == 1){return n;}if (n == 2){return n;}return FrogJump(n - 1) + FrogJump(n - 2);//递归
}int main()
{int n = 0;printf("请输入台阶数n:");scanf("%d", &n);int res = FrogJump(n);printf("%d\n", res);system("pause");return 0;
}

代码分析:
重复计算次数多,运行时间较长。

2、非递归实现:

把倒数第一个台阶的跳法数设为last1,倒数第二个台阶的跳法数设为last2,第三个台阶的跳法数设为cur。
根据f(n)=f(n-1)+f(n-2),我们可以得到:cur=last1+last2。运算完后,那么把整体的last1,last2,cur向后移动一位,重新迭代。直到你要求的第n个数,迭代结束,最后的cur就时第n级台阶的跳法数。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int FrogJump(int n){if (n == 1){return n;}if (n == 2){return n;}int last1 = 2;//倒数第一个台阶的跳法数int last2 = 1;//倒数第二个台阶的跳法数int cur = 0;//当前台阶的跳法数for (int i = 3; i <= n; i++){cur = last1 + last2;last2 = last1;last1 = cur;}return cur;
}int main()
{int n = 0;printf("请输入台阶数n:");scanf("%d", &n);int res = FrogJump(n);printf("%d\n", res);system("pause");return 0;
}

代码分析:
代码不够整洁,运行时间短。

四、问题进阶:

这时候青蛙变的很变态了,不仅一次可以跳上1级台阶,也可以跳上2级……甚至它还可以跳上n级台阶,此时该青蛙跳上一个n级的台阶总共有多少种跳法?

1、问题分析:

我们还是将n级台阶时的跳法看成是n的函数f(n)。

当n=1时,有一种跳法。
1、跳1级。
当n=2时,有两种跳法。
1、跳1级。
2、跳2级。
当n=3时,有四种跳法。
1、跳1级,跳1级,跳1级。
2、跳1级,跳2级。
3、跳2级,跳1级。
4、跳3级。
当第一次跳1级时,后面还有f(3-1)种跳法。
当第一次跳2级时,后面还有f(3-2)种跳法。
当第一次跳3级时,后面还有f(3-3)种跳法。

当有n级台阶时,
第一次跳1级时,后面还有f(n-1)种跳法,第一次跳2级时,后面还有f(n-2)种跳法,第一次跳3级时,后面还有f(n-3)种跳法……第一次跳n级时,后面还有f(n-n)种跳法。
所以,f(n)=f(n-1)+f(n-2)+……+f(n-n)=f(0)+f(1)+f(2)+……+f(n-2)+f(n-1)。
因为:f(n-1)=f(0)+f(1)+f(2)+……+f(n-2),
所以,f(n)=2*f(n-1)。

2、代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int FrogJump(int n){if (n == 1){return n;}if (n == 2){return n;}return 2 * FrogJump(n - 1);
}int main()
{int n = 0;printf("请输入台阶数n:");scanf("%d", &n);int res = FrogJump(n);printf("%d\n", res);system("pause");return 0;
}

青蛙跳台(递归和非递归实现)相关推荐

  1. python创建树结构、求深度_数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)...

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  2. 二叉树的几种递归和非递归式遍历:

    二叉树的几种递归和非递归式遍历: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 ...

  3. 全排列(含递归和非递归的解法)

    全排列在近几年各大网络公司的笔试中出现的比较频繁 首先来看看题目是如何要求的(百度迅雷校招笔试题). 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列, ...

  4. C#实现(递归和非递归)快速排序和简单排序

    C#实现(递归和非递归)快速排序和简单排序 本人因为最近工作用到了一些排序算法,就把几个简单的排序算法,想冒泡排序,选择排序,插入排序,奇偶排序和快速排序等整理了出来,代码用C#代码实现,并且通过了测 ...

  5. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)

    分别用递归和非递归方式实现二叉树先序.中序和后序遍历 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点.我们约定:先序遍历顺序 为根.左.右;中序遍历顺序为左.根.右;后序遍历顺序为左 ...

  6. 汉诺塔的改编题(用栈求解,分别递归和非递归)

    限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间,求当塔有N层的时候,打印最优移动过程和最优移动总步数 例如:当塔为两层时,最上层的塔记为1,最下层的塔记为2,则 ...

  7. 树的先序遍历,中序遍历,后续遍历(递归和非递归实现)

    前序遍历是先访问根节点再访问左子树最后访问右子树(中,左,右):中序遍历是先访问左子树再访问根节点最后访问右子树(左,中,右):后序遍历是先访问左子树再访问右子树最后访问根节点(左,右,中).---- ...

  8. 树与二叉树的深度优先与广度优先算法(递归与非递归)

    本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树   和  各种基本算法实现小结( ...

  9. 全排列(递归与非递归实现)

    全排列问题在公司笔试的时候非经常见,这里介绍其递归与非递归实现. 递归算法 1.算法简述 简单地说:就是第一个数分别以后面的数进行交换 E.g:E = (a , b , c),则 prem(E)= a ...

  10. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

最新文章

  1. Go 语言编程 — 基本数据类型
  2. Java 基础 - 如何重写equals()
  3. 043 hive数据同步到mysql
  4. 键盘录入一个正整数,把它的各个位上的数字倒着排列形成一个新的整数并输出。 例如:12345 数出54321 78760 输出6787(0省去)
  5. 知乎上已获千赞,全网独家首发!
  6. vi/vim 按键说明
  7. 真来了!已有高校正式通知:排查近5年硕博学位论文!
  8. 保存的离线网页总是自动跳转
  9. 【LeetCode】3月18日打卡-Day3
  10. 在web of science / 知网 上生成题录
  11. unity--常用物理公式
  12. 网络共享计算机网络无法访问,局域网电脑无法访问共享文件网络共享失败怎么解决...
  13. 图画日记怎么画_画画提高的一个方法: 绘画日记!
  14. flea-jersey使用之Flea RESTful接口客户端接入
  15. 抠像互动技术使人物与各种景物叠加,形成神奇的艺术效果
  16. ARM Linux Qt 5.x.x 无标题栏
  17. CSS3 animation-fill-mode 属性
  18. 如何安装操作系统?过程、图文。
  19. ros机器人标定线速度与角速度
  20. cocos creator接入微信登陆sdk ios篇

热门文章

  1. 【蓝桥杯】【啊哈!算法】解密QQ号——队列
  2. sql多表查询详解、用户表、角色表、权限表、权限加减表,根据用户id查询所有权限,连接查询
  3. 《Oracle性能优化与诊断案例精选》——第2章 回首向来萧瑟处,也无风雨也无晴...
  4. win10 英雄联盟登录不上服务器未响应,Win10英雄联盟登陆不上如何解决|Win10英雄联盟登陆不上的原因...
  5. python 窗口化 exe
  6. 小米 mix 2s 12.0.1 稳定版 中阉割系统api
  7. android8.1增大状态栏图标,转载▏手机状态栏看不懂的8个小图标,答案都在这里了!...
  8. .NETCore——异步
  9. 【招聘会】自己到底值多少?
  10. 现在做移动社交的,只能绕开微信玩差异化