剑指offer——面试题10 斐波那契数列

斐波那契数列

题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。
斐波那契数列的定义如下:
f ( n ) = { 0 n=0 1 n=1 f ( n − 1 ) + f ( n − 2 ) n>1 f(n)= \begin{cases} 0& \text{n=0}\\ 1& \text{n=1}\\ f(n-1)+f(n-2)& \text{n>1} \end{cases} f(n)=01f(n1)+f(n2)n=0n=1n>1

解法1:递归(时间复杂度高,无法编译通过)

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2)
class solution:
    def fab(self, n):
        if n == 0:
            return 0
        if n == 1:
            return 1
        else:
            return self.fab(n-1) + self.fab(n-2)

解法2:非递归

  • 思路: 从小往上计算,根据f(0)和f(1)算出f(2), f(1)和f(2)算出f(3), 以此类推算出第n项,时间复杂度O(n)
# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        if n == 0:
            return 0
        if n == 1:
            return 1
        else:
            sum = 0
            a = 0
            b = 1
            while n >1:
                sum = a+b
                # 保留大的数,把小的舍掉
                a = b
                b = sum
                n -= 1
            return sum

        # write code here

青蛙跳台

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

解法

  • 思路:第一次跳的情况: 若跳1级, 剩下n-1级, 跳法有f(n-1)种;若跳2级, 剩下n-2级, 跳法有f(n-2)种。于是,f(n) = f(n-1) + f(n-2), 这样就是一个斐波那契数列了
# -*- coding:utf-8 -*-
class Solution:
    def jumpFloor(self, number):
        # write code here
        if number == 1:
            return 1
        
        if number == 2:
            return 2
        
        else:
            j_one = 1
            j_two = 2
            sum = 0
            for i in range(2, number):
                sum = j_one + j_two
                j_one = j_two
                j_two = sum
            return sum

变态跳台阶

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

解法

  • 思路: 考虑第一次跳的情况:若跳了1级,剩下n-1级, 有f(n-1)种跳法; 跳了2级, 就有f(n-2)种跳法;…; 若跳了n-2级, 有f(2) = 2种, 若跳了n-1级, 有f(1)=1种, 若跳了n级, 有f(0)=1种;
    于是f(n) = f(0) + f(1) + … + f(n-1)
    f(1) = f(0) = 1 = 2^0
    f(2) = f(1) + f(0) = 2 = 2^1
    f(3) = f(2) + f(1) + f(0) = f(2) + f(2) = 2f( 2) = 2^2

    于是可以发现
    f(n) = 2
    f(n-1) = 2^(n-1)
# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        # write code here
        if number == 1:
            return 1
        
        a = 1
        sum = 0
        for i in range(1, number):
            sum = 2* a
            a = sum
        return sum

或者

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        # write code here
        return pow(2, number-1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值