1. 程式人生 > >《劍指offer》(面試題9):斐波那契數列

《劍指offer》(面試題9):斐波那契數列

前言

如果我們需要重複地多次計算相同的問題,通常可以選擇用遞迴或者迴圈兩種不同的方法。遞迴式在一個函式的內部呼叫這個函式自身。而迴圈則是通過設定計算的初始值及終止條件,在一個範圍內重複運算。

通常遞迴的程式碼會比較簡潔。在面試的時候,如果面試官沒有特別的要求,應聘者可以儘量多采用遞迴。

遞迴雖然有簡介的優點,但它同時也有顯著的缺點,那就是時間和空間的消耗:每一次函式呼叫,都需要在記憶體棧中分配空間以儲存引數、返回地址及臨時變數,而且往棧裡面壓入資料和彈出資料都需要時間,這就不難理解上述的例子中遞迴實現的效率不如迴圈了。

除了效率,遞迴還有可能引起更嚴重的問題:呼叫棧溢位。當遞迴呼叫的層數太多時,就會超出棧的容量,從而導致呼叫棧溢位。

題目描述

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。 
n<=39

解題思路

斐波那契數列的定義如下:

f(n)=0,1,f(n1)+f(n2),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