遞迴函式 頭遞迴和尾遞迴

2021-08-11 13:59:07 字數 2289 閱讀 2464

學習總結自《像程式設計師一樣思考》v.anton spraul 著,徐波 譯

遞迴,也就是乙個函式直接或間接呼叫自身。

一般來說,遞迴可以分為直接遞迴和間接遞迴。直接遞迴,是指函式自己呼叫自己的情況,而間接遞迴,是指呼叫其他函式時,在其他函式中又呼叫了自己的情況。

現在,主要將遞迴分為頭遞迴和尾遞迴來學習。

1.概念

頭遞迴:遞迴發生在函式的其他處理**之前(或理解為,遞迴發生在函式的頭部或頂部)

尾遞迴:與頭遞迴正好相反,遞迴發生在函式其他處理**的後面(或理解為,遞迴發生在函式的尾部)

2.例子

1)多少只鸚鵡

現在有5個連續的火車站臺(a,b,c,d,e),5個站台裡都有鸚鵡,每個站台只能與直接相鄰的站台通話,而負責人在a站台,問負責人如何知道這5個站台的鸚鵡總數。

方法1:

1》a站台計數他的站台的鸚鵡數量,7只鸚鵡;

2》a站台和b站台聯絡,告訴b站台當前的鸚鵡總數(乙個站台),7只鸚鵡;

3》b站台計數他的站台的鸚鵡數量,5只鸚鵡;

4》b站台和c站台聯絡,告訴c站台當前的鸚鵡總數(前兩個站台),12只鸚鵡;

5》c站台計數他的站台的鸚鵡數量,3只鸚鵡;

6》c站台和d站台聯絡,告訴d站台當前的鸚鵡總數(前三個站台),15只鸚鵡;

7》d站台計數他的站台的鸚鵡總數,10只鸚鵡;

8》d站台和e站台聯絡,告訴e站台當前的鸚鵡總數(前四個站台),25只鸚鵡;

9》e站台計數他的站台的鸚鵡總數,2只鸚鵡,得出5個站台的總鸚鵡數量是27只;

10》e站台向d站台反饋:鸚鵡總數是27只;

11》d站台向c站台反饋:鸚鵡總數是27只;

12》c站台向b站台反饋:鸚鵡總數是27只;

11》b站台向a站台反饋:鸚鵡總數是27只。

方法1採用的步驟提取如下:

1》對本站台的鸚鵡數量計數

2》把上乙個站台的總鸚鵡數量與本站台的鸚鵡數量相加

3》與下乙個站台通話,匯報當前的鸚鵡總數

方法2:

1》a站台與b站台通話:到你的站台為止的鸚鵡總數是多少;

2》b站台與c站台通話:到你的站台為止的鸚鵡總數是多少;

3》c站台與d站台通話:到你的站台為止的鸚鵡總數是多少;

4》d站台與e站台通話:到你的站台為止的鸚鵡總數是多少;

5》e是最後乙個站台,收到d的訊息後,計數他的站台的鸚鵡數量,2只鸚鵡;

6》e與d通話:目前為止,鸚鵡總數2只;

6》d站台計數他的站台的鸚鵡數量,10只鸚鵡,得到鸚鵡總數12只鸚鵡;

7》d與c通話:目前為止,鸚鵡總數12只;

8》c站台計數他的站台的鸚鵡數量,3只鸚鵡,得到鸚鵡總數15只鸚鵡;

9》c與b通話:目前為止,鸚鵡總數15只;

10》b站台計數他的站台的鸚鵡數量,5只鸚鵡,得到鸚鵡總數20只鸚鵡;

11》b與a通話:目前為止,鸚鵡總數20只;

12》a站台計數他的站台的鸚鵡數量,7只鸚鵡,得到鸚鵡總數27只。

方法2採用的步驟提取如下:

1》與下一站通話;

2》對當前站點的鸚鵡計數;

3》把當前站台的鸚鵡數量加上下一站點反饋的鸚鵡總數;

4》把相加所得的結果匯報給上乙個站台。

從這個例子可以看出,方法1是先對本站點的鸚鵡數量進行處理後,再去詢問下乙個站台的鸚鵡數量,是屬於尾遞迴的情況,而方法2是先進入到下乙個站台,讓下乙個站台處理鸚鵡數量,得到下乙個站台的鸚鵡數量後,再對該站台的鸚鵡數量進行計數相加,屬於頭遞迴的情況。

3.結論

頭遞迴與尾遞迴相比,將處理過程置後,從遞迴的目的出發,將大問題細化成小問題,細化到可以解決的程度後,將結果一層層反饋,而較大細度的問題可以直接將該結果作為已知資料進行計算使用,使遞迴過程更加方便清晰。尾遞迴過程是先對當前細度的問題進行處理,但是該結果只是乙個暫時值,需要將問題一層層細化後,每層對當前的暫時值進行計算操作,得到最終的結果,可以看做是乙個不斷修正的過程,所以尾遞迴過程相對頭遞迴來說,計算較慢,所佔資源也會較多。所以,建議採用頭遞迴。

一般來說,頭遞迴更加體現了遞迴的思想,大遞迴思想,在使用遞迴解決問題時,我們的思維應該有別於其他的函式的實現過程,在實現其他函式時,我們會細化各個過程,用程式化的思維來思考各個步驟,這個思維用在遞迴函式時,將會以尾遞迴的方式呈現出來,因為,我們都想盡可能完成函式功能,就會不自覺的將可以實現的功能寫在了前面。大遞迴的思想就是讓我們多在意遞迴函式的意義,我們在用遞迴函式實現某一功能時,應該時時牢記該遞迴函式的功能,多關注該問題與子問題之間的關係,盡可能用頭遞迴的方式實現遞迴函式。

遞迴和尾遞迴

c語言中編譯預處理的三種形式的命令 巨集定義,檔案包含,條件編譯命令。1 巨集定義主要是 define,undef 如下 define pi 3.1415926 不帶引數的巨集定義 define max a,b a b?a b 帶引數的巨集定義 說明 巨集定義在c語言與c 語言中是相通的。下面舉例說...

遞迴函式及尾遞迴

自己呼叫自己的函式,一去一回就是遞迴函式 示例一 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 ...

遞迴 尾遞迴

階乘函式 n n n 1 n 2 3 2 1 針對這樣的表述,直譯成乙個過程 define factorial n if n 1 1 n factorial n 1 如果是factorial 6 其計算行為是 factorial 6 6 factorial 5 6 5 factorial 4 6 5...