斐波那契数列、青蛙跳、变态青蛙跳

斐波那契数列

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。

(斐波那契数列:0,1,1,2,3,....,即后一项为前两项之和的数列)

demo:

class Solution:
    def Fibonacci(self, n):
        # write code here
        if n<=1:
            return n
        f1,f2 = 0,1
        for i in range(n-1):
            f1,f2 = f2,f1+f2
        return f2

找规律:

index = 0,1 时候:Fibonacci = 0,1

index = 2 , Fibonacci[2] =Fibonacci[0]+Fibonacci[1]

index = 3,Fibonacci[3] =Fibonacci[1]+Fibonacci[2]

所以:Fibonacci[n] =Fibonacci[n-2]+Fibonacci[n-1]

所以可以用递归和动态规划将问题划分为子问题进行解决。

青蛙跳

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

分析:青蛙一次跳一级或者二级,共n级台阶。最后一次青蛙可能跳1级,可能跳2级,这样的倒推思路,倒数第二次跳,仍然可能跳1级或者2级,因此n级台阶的所跳次数与n-1级和n-2级台阶所跳方法相关,并为两者之和。

class Solution:
    def jumpFloor(self, number):
        # write code here
        if number<=2:
            return number
        f1,f2 = 1,2
        for i in range(2,number):
            f1,f2 = f2,f2+f1
        return f2

找规律:

台阶数1:共1种;

台阶数2:共2种;

台阶数3:共3种;

台阶数4:共5种;

台阶数5:共8种;

台阶数为n,则有f(n)种方法:f(n)=f(n-1)+f(n-2)

变态青蛙跳

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

分析:n级台阶,青蛙可跳的台阶数目为1、2、3...n,则跳到n级台阶与n级台阶、n-1级台阶、n-2级台阶直到1级台阶的跳法均相关,即为它们之和。即f(n)=f(1)+f(2)+f(3)+...+f(n-1)+1,f(n-1)=f(1)+f(2)+...+f(n-2)+1;这样的数列计算方式过于复杂,换一种方式思考:青蛙可跳台阶数目为1-n,那么对于n个台阶,所有的情况均为跳或者不跳,即2^(n-1)种跳法。

class Solution:
    def jumpFloorII(self, number):
        # write code here
        return 2**(number-1)

规律:

台数1:台数1,青蛙跳的方式有1种,可以选择跳与不跳,共2^(1-1)=1种;

台数2:台数2,青蛙跳的方式有2种,可以选择跳与不跳,共2^(2-1)=2种;

台数3:台数3,青蛙跳的方式有3种,可以选择跳与不跳,共2^(3-1)=4种;

台数4:台数4,青蛙跳的方式有4种,可以选择跳与不跳,共2^(4-1)=8种;

因此:

台数n:台数n,青蛙跳的方式有n种,可以选择跳与不跳,共2^(n-1)种;

或:

class Solution:
    def jumpFloorII(self, number):
        # write code here
        f1 = 1
        for i in range(number-1):
            f1 = 2*f1
        return f1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值