面試題10:演算法題——斐波那契數列
阿新 • • 發佈:2019-01-27
題目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