遞迴及遞迴的特例

2021-09-12 13:13:31 字數 2767 閱讀 9500

1.定義在乙個函式過程**現直接或間接呼叫函式本身,稱為函式的遞迴呼叫。

eg:有乙個學生在一起,問第五個學生有多少歲,他說比第4個學生大2歲。問第四

個人多少歲,他說比第三個人大兩歲。問第三個人有多少歲,第三個人說他比第二

個人大兩歲。問第二個人多少歲,第二個人說他比第乙個人大兩歲。第乙個人10歲。

第一種解法:用迴圈

第二種解法

首先我們要了解遞迴的兩大要素:

(1)邊界條件:確定遞迴何時終止,也稱遞迴的出口

(2)遞迴模式:大問題是如何分解成小問題的,也稱遞迴體.(縮小問題的規模)

假如我們要求第n個人的年齡,我們可以將這個問題分成n步:

(1):求第n個人的年齡

(2):求第n-1個人的年齡

(3):求第n-2個人的年齡

(4):求第二個人的年齡

(5)求第乙個人的的年齡

2.遞迴的典型例題

斐波那契數列:1 1 2 3 5 8 13 21.....

我們可以通過上面的一組數列了解到斐波那契數列的規律:除了第一項和第二項為1,其他項就等於那一項的前兩項之和。

由此我們可以得到:

然而斐波那契的數列是最不適合使用遞迴呼叫的。

我們還是通過這個例子分析:

(1):求第n個人的年齡

(2):求第n-1個人的年齡

(3):求第n-2個人的年齡

(4):求第二個人的年齡

(5)求第乙個人的的年齡

假如我們要求第五個人的年齡,那我們必須訪問第四個人的年齡;我們想要知道第四個人的年齡,就必須訪問第三個人的年齡;

我們想要知道第三個人的年齡,就必須訪問第二個人的年齡;我們想要知道第二個人的年齡,就必須訪問第乙個人的年齡。這就是我們入棧的時候。

然而我們只知道第乙個人的年齡並不知道其他人的年齡,所以在入棧的時候必須把其他人的年齡儲存起來。

棧的特點:先進後出,後進先出

當我們知道了第乙個人的年齡後,我們就可以以此類推求出第五個人的年齡。這就到出棧的時候。

我們可以通過上面幾幅圖發現,斐波那契的時間複雜度和kong空間複雜度都是o(n)。比我們用迴圈都要慢,所以斐波那契是最不適合用遞迴的數列。

我們ji介紹了最不適合用遞迴的例子,那我們就講一下最適合用遞迴的例子。

3.最適合遞迴的例子

漢諾塔:古代有乙個梵塔,塔內有3個座a,b,c,開始a座上有64個盤子,盤子大小不等,大的在下面,小的們在上面。有乙個老和尚想要把這64個盤子從a座移到c座,但規定每次只能移動乙個盤子,且在移動過程中始終保持大的在上面,小的在下面。在移動過程中可以利用b座,要求找出最簡單的移動步驟。如圖所示

我們通過畫圖得到這樣乙個規律:有n個盤子,那我們就需要移動2的n-1次。我們可以先將a座上的n-1個盤子通過b移到c上,再將a座上的盤子移到c上,然後通過a將b上的盤子移動c上。

演算法:

#include

void move(char x,char y)

int hanoi(int n,char a,char b,char c)

else

}

int main()

遞迴函式及尾遞迴

自己呼叫自己的函式,一去一回就是遞迴函式 示例一 def digui n print n,1 if n 0 digui n 1 print n,2 digui 5 示例二 階乘 num 1 def func n global num if n 0 func n 1 num n return num ...

遞迴及練習

分析 遞迴的思想,舉個例子吧!電影院看電影院,當你去晚了,然後從最後一排問,你是第幾排,一直問到第一排,然後第一排的人又以相同的方式傳回來,重複做相同的工作,先去傳遞 你是第幾排 這個問題,然後回歸給自己 我是第幾排 得到結果。自己呼叫自己,會出現無限迴圈的問題 死迴圈 所以必須有跳出,結束條件,才...

遞迴的效率問題及遞迴與迴圈比較

遞迴的效率問題及遞迴與迴圈比較 1.所謂的遞迴慢到底是什麼原因呢?大家都知道遞迴的實現是通過呼叫函式本身,函式呼叫的時候,每次呼叫時要做位址儲存,引數傳遞等,這是通過乙個遞迴工作棧實現的。具體是每次呼叫函式本身要儲存的內容包括 區域性變數 形參 呼叫函式位址 返回值。那麼,如果遞迴呼叫n次,就要分配...