- N +

斐波那契數列python遞歸算法(Python遞歸函數)

fib函數使用方法

fib函數是一個常見的計算斐波那契數列的函數。它接受一個整數參數n,并返回斐波那契數列的第n個數。使用方法如下:

1.導入fib函數所在的模塊或定義fib函數。

2.調用fib函數,傳入一個整數參數n。

3.函數將返回斐波那契數列的第n個數。

例如,如果要計算斐波那契數列的第10個數,可以使用fib(10)。注意,斐波那契數列的索引從0開始,所以fib(0)返回的是第一個數。

Python遞歸函數到底是什么原理

首先,遞歸不是python獨有的,遞歸是一種算法,簡單地說,就是一個函數不停地調用自己,直至達到停止條件。

構成遞歸需具備兩個條件:

子問題須與原始問題為同樣的事,且更為簡單;不能無限制地調用本身,須有個出口(即要有個邊界),化簡為非遞歸狀況處理其中遞歸又分為直接遞歸和間接遞歸。

遞歸又分為兩情況,分別為直接遞歸和間接遞歸。

直接遞歸是在A函數中嵌套使用A函數,然后有一個停止該函數的條件。間接遞歸是在A函數中調用B函數,然后在B函數中調用A函數,即間接調用自己實現遞歸。

這里我用著名的斐波那契數列(即從第3項起,后一個數為前兩項之和)做演示:

運行得出第10項結果為34,結果正確。現在我們來分析其運行過程中,為方便理解,我們計算第5項,運行過程我們用如下圖表示:

從圖中我們可以看出,所謂遞歸,就是把大的事件,逐步細化分別進行處理,這就是分治的思想。

那么遞歸是在計算機中怎樣實現的呢?如果我們有了解過數據結構這門課程,我們就會知道,這就是用棧來實現的。

還有一點值得注意的,我們看上圖是不是有些相同的部分重復調用了,所以說使用遞歸會使程序變得相對慢一些,在日常開發中,我們是比較少用的,雖然遞歸的代碼塊看起來比較簡潔。

什么是遞歸基例

所謂基例就是不需要遞歸就能求解的,一般來說是問題的最小規模下的解。

例如:斐波那契數列遞歸,f(n)=f(n-1)+f(n-2),基例是1和2,f(1)和f(2)結果都是1

再比如:漢諾塔遞歸,基例就是1個盤子的情況,只需移動一次,無需遞歸

遞歸必須有基例,否則就是無法退出的遞歸,不能求解。

python函數怎么調用自身

針對這個Python函數問題,我從以下幾點回答:

1.Python函數定義——def

Python有很多已經定義好了的內置函數和模塊,如果是自定義函數,則要像下面這樣:

定義一個函數要使用關鍵字def,后面是函數名,括號,括號內是函數的參數,沒有參數的時候不寫,再后面就是冒號,然后在縮進塊中編寫函數體,最后使用關鍵字return返回函數值,沒有返回值可以不寫,也可以只寫return,后面不跟值。這便是函數的基本定義。

注意:

函數名不要使用Python既定關鍵字,也不要是常用的內置函數,最好也不要使用test

函數參數可以有默認值,還可以寫不定參數等,比如print函數就是不定參數(*args)

返回多個值的時候,是以tuple的形式,函數在執行到return語句后,便會返回。

函數名與語句塊中間的三引號注釋,是屬于函數的doc,方便查詢函數信息的,有必要的話,還可以寫上參數和返回值的信息。

關于函數的知識點還是挺多的,不過就重要性而言,還是函數本身邏輯的實現才是主要的,其他一些小細節,遇到了就明白了。

2.Python函數的調用

函數定義好了,我們則要用起來,這也是本次作答的重點。如果是在本模塊內(同一個py文件內)調用,則很簡單,寫一個if語句,如下:

這是推薦的寫法,當然,你也可以直接這樣

上面兩種方式都能正確運行函數的調用過程,不過,__name__==‘__main__’的作用是,當此模塊(py文件)被其他文件導入的時候,便不會執行,而僅僅是導入函數的定義。

__name__是模塊的一個屬性,其作用是調用當前模塊的名稱,若此模塊是直接執行時,__name__==‘__main__’。當此模塊是被其他程序import時,__name__的值為此模塊的名稱。

好了,函數的簡單調用就是這樣,若是想在其他模塊中調用這個函數,那么:

假如你這個函數保存在文件名為:def_study.py

當然,導入模塊的知識點也很多,這里就不細講了

Python函數調用自身

上面說清楚了函數的基本調用方法,那么,如題主所說的,想要調用函數自身該怎么做呢?舉個栗子:上面是一個經典的數列:斐波那契數列,我們用函數來實現其計算

看注釋你也知道了什么是斐波那契數列。上面的函數中,當n不為0和1時,就會調用函數自身,將參數分別減1和2。這樣的寫法,叫做遞歸。

遞歸會以棧的形式依次調用函數自身,直到條件發生變化到底,才會依次返回每一次遞歸調用的值,說實話,遞歸很占內存。我們是可以用循環改寫此函數的。

循環的辦法,就是依次計算第1,2,3……直到n個數的值。

這便是調用函數自身的例子!歡迎指正!

遞歸算法前提及方法

遞歸是設計和描述算法的一種有力的工具,由于它在復雜算法的描述中被經常采用,為此在進一步介紹其他算法設計方法之前先討論它。

能采用遞歸描述的算法通常有這樣的特征:為求解規模為N的問題,設法將它分解成規模較小的問題,然后從這些小問題的解方便地構造出大問題的解,并且這些規模較小的問題也能采用同樣的分解和綜合方法,分解成規模更小的問題,并從這些更小問題的解構造出規模較大問題的解。特別地,當規模N=1時,能直接得解。

遞歸算法的執行過程分遞推和回歸兩個階段。在遞推階段,把較復雜的問題(規模為n)的求解推到比原問題簡單一些的問題(規模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是說,為計算fib(n),必須先計算fib(n-1)和fib(n-2),而計算fib(n-1)和fib(n-2),又必須先計算fib(n-3)和fib(n-4)。依次類推,直至計算fib(1)和fib(0),分別能立即得到結果1和0。在遞推階段,必須要有終止遞歸的情況。例如在函數fib中,當n為1和0的情況。

在回歸階段,當獲得最簡單情況的解后,逐級返回,依次得到稍復雜問題的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的結果,……,在得到了fib(n-1)和fib(n-2)的結果后,返回得到fib(n)的結果。

在編寫遞歸函數時要注意,函數中的局部變量和參數知識局限于當前調用層,當遞推進入“簡單問題”層時,原來層次上的參數和局部變量便被隱蔽起來。在一系列“簡單問題”層,它們各有自己的參數和局部變量。

由于遞歸引起一系列的函數調用,并且可能會有一系列的重復計算,遞歸算法的執行效率相對較低。當某個遞歸算法能較方便地轉換成遞推算法時,通常按遞推算法編寫程序。例如上例計算斐波那契數列的第n項的函數fib(n)應采用遞推算法,即從斐波那契數列的前兩項出發,逐次由前兩項計算出下一項,直至計算出要求的第n項。

選擇排序法是對定位比較交換法的一種改進。在講選擇排序法之前我們先來了解一下定位比較交換法。為了便于理解,設有10個數分別存在數組元素a[0]~a[9]中。定位比較交換法是由大到小依次定位a[0]~a[9]中恰當的值(和武林大會中的比武差不多),a[9]中放的自然是最小的數。如定位a[0],先假定a[0]中當前值是最大數,a[0]與后面的元素一一比較,如果a[4]更大,則將a[0]、a[4]交換,a[0]已更新再與后面的a[5]~a[9]比較,如果a[8]還要大,則將a[0]、a[8]交換,a[0]又是新數,再與a[9]比較。一輪比完以后,a[0]就是最大的數了,本次比武的武狀元誕生了,接下來從a[1]開始,因為狀元要休息了,再來一輪a[1]就是次大的數,也就是榜眼,然后從a[2]開始,比出探花,真成比武大會了,當必到a[8]以后,排序就完成了。

下面給大家一個例子:

mai()

{

inta[10];

inti,j,t;

for(i=0;i

for(i=0;i

for(j=i+1;j

if(a[i]

for(i=0;i

}

好啦,羅嗦了半天總算把定位比較排序法講完了,這個方法不錯,容易理解,就是有點麻煩,一把椅子換來換去,哎~

所以就有了下面的選擇排序法,開始的時候椅子誰也不給,放在一邊讓大家看著,找個人k記錄比賽結果,然后發椅子。具體來講呢就是,改進定位比較排序法,但是這個改進只是一部分,比較的次數沒變,該怎么打還是怎么打,就是不用換椅子了。每次外循環先將定位元素的小標i值記錄到K,認為a[k]是最大元素其實i=k還是a[i]最大,a[k]與后面的元素一一比較,該交換的也是也不換,就是把K的值改變一下就完了,最后在把a[k]與a[i]交換,這樣a就是最大的元素了。然后進入下一輪的比較。選擇排序法與定位比較排序法相比較,比的次數沒變,交換的次數減少了。

下面也寫個例子:

main()

{

inta[10];

inti,j,t,k;

for(i=0;i

for(i=0;i

{k=i;/*裁判AND記者實時追蹤報道比賽情況*/

for(j=i+1;j

if(a[k]

t=a[i];a[i]=a[k];a[k]=t;/*t發放獎品*/

}

for(i=0;i

}

Python求斐波那契數列前20項和

斐波那契數列是一個遞歸定義的序列,可以使用遞歸函數或循環計算前20項和。以下是使用循環方法計算斐波那契數列前20項和的Python代碼:

```

#初始化前兩個數

a,b=0,1

#初始化前20項和

total=0

#計算前20項的和

foriinrange(20):

a,b=b,a+b

total+=a

#輸出結果

print("前20項和為:",total)

```

輸出結果為:前20項和為:17710

返回列表
上一篇:
下一篇: