《劍指offer》(面試題9):斐波那契數列
阿新 • • 發佈:2019-01-26
前言
如果我們需要重複地多次計算相同的問題,通常可以選擇用遞迴或者迴圈兩種不同的方法。遞迴式在一個函式的內部呼叫這個函式自身。而迴圈則是通過設定計算的初始值及終止條件,在一個範圍內重複運算。
通常遞迴的程式碼會比較簡潔。在面試的時候,如果面試官沒有特別的要求,應聘者可以儘量多采用遞迴。
遞迴雖然有簡介的優點,但它同時也有顯著的缺點,那就是時間和空間的消耗:每一次函式呼叫,都需要在記憶體棧中分配空間以儲存引數、返回地址及臨時變數,而且往棧裡面壓入資料和彈出資料都需要時間,這就不難理解上述的例子中遞迴實現的效率不如迴圈了。
除了效率,遞迴還有可能引起更嚴重的問題:呼叫棧溢位。當遞迴呼叫的層數太多時,就會超出棧的容量,從而導致呼叫棧溢位。
題目描述
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。
n<=39
解題思路
斐波那契數列的定義如下:
f(n)=⎧⎩⎨0,1,f(n−1)+f(n−2),n = 0n = 1n > 1
實現f(n)=f(n-1)+f(n-2)的方法有很多種,遞迴、迴圈都可以。
注意:由於遞迴比較耗費時間,加上python的執行效率本來就低,所以python的遞迴呼叫一般在牛客網的例項測試中下總是超時。這次C++的遞迴呼叫也超時了,所以啊,面試手寫優先使用遞迴,線上程式設計優先使用迴圈吶。
python 程式碼實現:遞迴:
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n <= 0:
return 0
if n == 1:
return 1
return self.Fibonacci(n-1) + self.Fibonacci(n-2)
迴圈:
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n <= 0:
return 0
if n == 1:
return 1
first = 0
second = 1
third = 0
for i in range(2,n+1):
third = first + second
first = second
second = third
return third