遞迴呼叫的理解

2021-07-26 16:04:42 字數 1946 閱讀 7466

關於遞迴呼叫的理解問題

前幾天做題的時候,發現《資料結構高分筆記》第一章有這樣乙個思考題,對理解遞迴呼叫幫助很大,題目如下:

題目:逆序輸出單鏈表的資料域,要求 指標l指向鍊錶首元結點,且只用l乙個指標

(一)分析:在單鏈表的情況下,要逆序輸出結點資料只用乙個指標,除了用遞迴呼叫,好象沒有別的方法了。關鍵在於,如何設計遞迴呼叫?

遞迴呼叫屬於分治法的一種思想,乙個包含直接或者間接呼叫自身函式的語句的函式被稱為遞迴函式,但不是所有的呼叫自身都是遞迴,必須滿足以下條件:

(1)在每一次呼叫自身時,必須是(在某種意義上)更接近於解;

(2)必須有乙個終止 處理或者計算 的準則;

設計的演算法如下:

————————————————————————————————————

void reverseprint(lnode *l)                                            //逆序輸出鍊錶

cout << l->data<

}————————————————————————————————————

我們假設從首元結點到尾元結點共有9個結點,指標l指向首元結點,當執行到if語句時,很明顯」 l->next!= null 「成立,於是執行「 reverseprint(l->next); 」進入遞迴第二層,第二層迴圈執行到if語句後同樣」 l->next!= null 「成立,於是進入到遞迴第三層……值得說明的是「 reverseprint(l->next); 」語句中,( )中必須寫成」( l->next )「,如果寫成(l),便會進入死迴圈,違背了上面條件(1)。而」 l->next!= null 「就是終止處理的準則,也就是上面的條件(2);

當進入遞迴第九層以後,」 l->next!= null 「不成立,於是直接執行" cout << l->data另外值得一提的是" cout << l->data<

(二)關於遞迴呼叫的時間複雜度問題

如上九個結點,九層迴圈的時間複雜度為9,也就是說這個演算法時間複雜度為o(n)。初學者可能會懷疑時間複雜度為n次方,但是仔細比較就會發現,遞迴和迴圈的時間複雜度很類似。遞迴九層逆序輸出,時間複雜度為9;for(i=1;i<=9;i++)迴圈順序輸出9次,時間複雜度也是9。

因此,靈活的使用遞迴和迴圈,可以解決線性表的各種順序以及逆序問題!

完整的**如下(vs2013編譯環境):

————————————————————————————————————

//  逆序列印單鏈表的資料    指標l指向鍊錶開始  要求只用l乙個指標

/*分析: 採用遞迴   printnode

很神奇的想法!對理解遞迴有很大幫助!!!

*/#include "stdafx.h"

#include

#include "stdlib.h"

using namespace std;

static int length = 9;

typedef struct lnodelnode;

lnode *createlink( )//創立鍊錶 

return head;

}void printlink(lnode *head)//輸出鍊錶 

while (temp->next!=null);

cout << temp->data;

cout << endl;

}void reverseprint(lnode *l)                                            //逆序輸出鍊錶

cout << l->data<

}int _tmain(int argc, _tchar* argv)

————————————————————————————————————

輸出結果如下: 

入門 初步理解遞迴呼叫

以前遇見遞迴總會把其想像成乙個黑盒子方法,不會嘗試去理解它。先看一段偽 void recurs argumentlist 如果遞迴函式呼叫自己,則被呼叫的函式也將呼叫自己,這將無限迴圈進行下去,除非包含終止呼叫鏈的內容,通常的方法將遞迴放在if語句中。如上所示,test最終會為false終止呼叫。只...

個人理解 尾呼叫與遞迴

尾呼叫就是指某個函式的最後一步是呼叫另乙個函式。尾遞迴就是尾呼叫自身。相信大家都看過阮老師的這篇文章 尾呼叫優化 他是說,函式呼叫會在記憶體形成乙個 呼叫記錄 又稱 呼叫幀 call frame 儲存呼叫位置和內部變數等資訊。如果在函式a的內部呼叫函式b,那麼在a的呼叫記錄上方,還會形成乙個b的呼叫...

深入理解遞迴函式的呼叫過程

下面是個關於遞迴呼叫簡單但是很能說明問題的例子 遞迴例子 includevoid up and down int int main void void up and down int n 輸出結果 level 1 n location 0240ff48 level 2 n location 0240...