1. 程式人生 > >面試題10:演算法題——斐波那契數列

面試題10:演算法題——斐波那契數列

題目1:求斐波那契數列的第n項。

斐波那契數列的定義:f(0)=0 f(1)=1   f(n)=f(n-1)+f(n-2)

教科書上反覆用這個問題來講解遞迴函式,並不能說明遞迴函式解法最適合這道題目,這種方法有很嚴重的效率問題(存在重複計算),需要一種實用的解法。 由下往上計算,根據f(1)和f(2)計算出f(3),由f(3)和f(2)計算出f(4),迴圈下去,直至計算出f(n)

基於迴圈

class Solution:
    def Fibonacci(self, n):
        # write code here
        small=0
        big=1
        if n<=0:
            return 0
        if n==1:
            return 1
        for i in range(2,n+1):
            sum_i=small+big
            small=big
            big=sum_i
        return big

基於遞迴,(不太推薦,效率低,可能不能通過)

# -*- coding:utf-8 -*-
class Solution:
    def Fibonacci(self, n):
        # write code here
        if n<=0:
            return 0
        elif n==1:
            return 1
        return self.Fibonacci(n-1)+self.Fibonacci(n-2)

題目二:青蛙跳臺階(斐波那契數列的應用)

一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法

當n>2時,第一次跳就有兩種不同選擇,一是第一次只挑一個臺階,此時跳法數目為後面剩下的n-1級臺階跳法數目,二是第一次跳兩個臺階,此時跳法數目為後面剩下的n-2級臺階跳法數目,即 f(n)=f(n-1)+f(n-2),解法同上

擴充套件:

 題目拓展2:變態跳臺階

一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

數學歸納出f(n)=2^(n-1)

題目拓展3:矩形覆蓋

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法? 

解題思路:這道題本質上還是斐波那契數列問題,注意分析n=0,1,2,3,...的值的情況。

# -*- coding:utf-8 -*-
class Solution:
    def rectCover(self, number):
        # write code here
        if number<=0:
            return 0
        if number==1:
            return 1
        if number==2:
            return 2
        small,big=1,2
        for i in range(3,number+1):
            sum_i=small+big
            small=big
            big=sum_i
        return big