算法面试题 :变态跳台阶( python实现 )

变态跳台阶( python实现 )

一、题目描述

题目:变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级 …它也可以跳上 n 级,此时该青蛙跳上一个 n 级的台阶总共有多少种跳法?

二、解题思路

  这里,我们做一个简单的推导。

  因为青蛙可以跳1级,也可以跳2级…也可以跳n级。

  那么,在 n>2 的前提下,我们分情况讨论。

  情况 1:若青蛙第一步跳 1 级,剩下 n-1 级,相当于有 f(n-1) 种跳法;

  情况 2:若青蛙第一步跳 2 级,剩下 n-2 级,相当于有 f(n-2) 种跳法;

  \cdot{}\cdot{}\cdot{}\cdot{}\cdot{}\cdot{}

  情况 n-1:若青蛙第一步跳 n-1 级,还剩下 1 级,相当于还有 f(1) 种跳法;

  情况 n:若青蛙第一步跳 n 级,还剩下 0 级,相当于就 1 种跳法;

  最后将以上所有情况加起来,便得到 f(n) 的结果,如下:

(1)f(n)=f(n1)+f(n2)+...+f(1)+1 f(n) = f(n-1)+f(n-2)+...+f(1) +1\tag{1}

  其中,f(n)f(n) 表示求出来的 n 级台阶有多少种跳法 ,例如,f(1)=1f(1) = 1 。(当 n = 1,就只有 1 种跳法,即 f(1)=1f(1) = 1

  理解了公式 (1),同理也可得到公式 (2),如下:

(2)f(n1)=f(n2)+f(n3)...+f(1)+1f(n-1) = f(n-2)+f(n-3)...+f(1)+1 \tag{2}

  接下来,公式 (1) 与公式 (2) 做减法,可以得到公式 (3),如下:

(3)f(n)=2f(n1)f(n) =2f(n-1) \tag{3}

  到这里,就不难发现其微妙之处了(哈哈哈,一开始被题目吓到的我终于放心了)。

  根据公式 (3),我们可以将原问题转化成一个简单的问题,即 n 级台阶的跳法就是 n-1 级台阶跳法的 2 倍。

  当 n = 1 时,只有 f(1)f(1) = 1 种跳法;

  当 n = 2 时,则有 f(2)f(2) = 2 种跳法( 即 2 f* f(1) );

  当 n = 3 时,则有 f(3)f(3) = 4 种跳法( 即 2 f* f(2) )。…

  分析到这里,我们就来看看程序代码如何实现。

三、代码实现

  这里的代码在 牛客网剑指offer:变态跳台阶 已测试通过,具体如下:

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        # write code here
        if number == 0:
            return 0
        if number == 1:
            return 1
        return_number = 1
        for i in range(2,number+1):
            return_number = return_number * 2
        return return_number

  

相关题目链接:

[1] 剑指offer_面试题10 : 斐波那契数列( python实现 )
[2] 个人专栏:算法面试题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章