剑指offer——变态跳台阶

题目描述

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

问题分析

  由于每次跳的阶数不确定,没有一个固定的规律,但是可以了解的是后一次跳是在前一次跳的结果上累加的,因此我们可以考虑使用递归的方法来解决问题。

  那么从递归的三个步骤开始寻找解决方案:

  1. 递归截止条件。

  由于每次可以跳1-n的任意阶数,因此无论有多少阶,都可以一次跳完,为了表示方便,我们将一次性跳完的情况设为F(0),当n=1时,只能有一种情况,F(1) = 1。当n=2时,可以每次跳1阶,也可以一次跳两阶,则F(2) = 2。

  2. 递归的前后衔接。

  假设现在又n阶,可以跳完n阶的情况分别是:一次跳完F(0);先跳一步F(1),后面还有F(n-1)种跳法;或者先跳两步F(2),后面还有F(n-2)种跳法。依次类推,第一次跳出n阶后,后面还有 F(n-n)中跳法。可以得出:

  F(n) = F(n-1)+F(n-2)+F(n-3)+..........+F(0)

  3. 递归节点数据的处理。

  根据题目,本题目中用到的递归只是统计前后计数,并没有数据处理。对于其他递归,可以具体情况具体对待。

源码

 1     public int JumpFloorII(int target) {
 2         if(target==0||target==1)
 3             return 1;
 4         if(target==2)
 5             return 2;
 6         int sum = 0;
 7         for(int i=0;i<target;i++){
 8             sum += JumpFloorII(i);
 9         }
10         return sum;
11     }
时间: 2024-10-10 18:11:59

剑指offer——变态跳台阶的相关文章

(原)剑指offer变态跳台阶

变态跳台阶 时间限制:1秒空间限制:32768K 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 分析一下明天是个斐波那契数列,我们一步一步退出其通项公式. 设台阶数为n, 总跳法为jumps n          jumps 1 1 2 2 3 4 4 8 5 16 现在猜测其通项公式为 fbonicc(n) = 2 * fbonicc(n - 1) 列出4的全部跳法 5的全部跳法 1111 1111 (1) 2  11

【剑指Offer】跳台阶&amp;变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 当n = 1时,有一种跳法.f(1) = 1 当n = 2时,有两种跳法,跳两次,一次跳一级.跳一次,直接跳两级. f(2) = 2 当n > 2时,第一次跳一级,这时跳法数目就等于后面n - 1级的跳法数目,第一次跳两级,这时跳法数目就等于后面n - 2级的跳法数目.因此f(n) = f(n-1) + f(n-2).结果为斐波那契数列. 解法一.递归 (时间复杂度随

剑指offer青蛙跳台阶问题

(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级.求该青蛙跳上一个n 级的台阶总共有多少种跳法. //递归方式 public static int f(int n) { //参数合法性验证 if (n < 1) { System.out.println("参数必须大于1!"); System.exit(-1); } if (n == 1 || n == 2) return 1; else return f(n - 1) + f(n - 2); } //非递归方式 publ

【剑指Offer】跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 解题思路 递归,由上一步到这一步青蛙跳了一级或跳了两级,当前台阶数为n,那跳n级台阶的方法数就是问跳n-1和跳n-2级楼梯方法数相加.由此可看出,这是一个斐波那契数列. 结束条件就是当n=1时,只有一种方法(跳一级):n=0时,0种方法:当n=2时,有两种方法(一次跳一级,跳两次:一次直接跳两级) 代码实现 class Solution { public: int jumpFloor(int n

剑指OFFER之跳台阶(九度OJ1388)

题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入包括一个整数n(1<=n<=70). 输出: 对应每个测试案例, 输出该青蛙跳上一个n级的台阶总共有多少种跳法. 样例输入: 5 样例输出: 8 题目分析: 这道题很明显正向分析是不行的,也就是说,最后面的一个台阶,要依赖于前面台阶的.所以,最后一个台阶的方法数目可以由前面计算出来.那么,仔细想一下,一个青蛙只能跳1-2步,也就是说,

《剑指offer》---跳台阶问题

本文算法使用python3实现 1. 问题1 1.1 题目描述: ??一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. ??时间限制:1s:空间限制:32768K 1.2 思路描述: ??(1)当 $ n=0 $ 时,返回0 ??(2)当 $ n=1 $ 时,只有一种跳法:跳1级台阶. ??(3)当 $ n=2 $ 时,有两种跳法:(a) 跳1级再跳1级:(b) 直接跳2级. ??(4)当 $ n=3 $ 时,我们只考虑最后一步的情况:(a)当最后一步只

剑指offer 08跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). java版本: public class Solution { public static void main(String[] args){ long startTime=System.currentTimeMillis(); System.out.println("第30项的结果是:"+JumpFloor(30)); long endTime=System.cur

剑指:变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路: 关于本题,前提是n个台阶会有一次n阶的跳法.分析如下: f(1) = 1 f(2) = f(2-1) + f(2-2)         //f(2-2) 表示2阶一次跳2阶的次数. f(3) = f(3-1) + f(3-2) + f(3-3) ... f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-(n-1)) + f(n-n

剑指offer T8跳台阶

由推导可知,递推公式为 f(n) = f(n-1) + f(n-2) 迭代法: 递归: 递归优化(保存结果,剪枝): 原文地址:https://www.cnblogs.com/jiguang321/p/11619071.html