遞迴的工作原理

2021-06-23 04:06:16 字數 1485 閱讀 9929

理解遞迴的工作原理

為了理解遞迴的工作原理,你需要追蹤遞迴呼叫的執行過程,所以讓我們來進行這項工作。追蹤乙個遞迴函式的執行過程的關鍵是理解函式中所宣告的變數是如何儲存的。當函式被呼叫時,它的變數的空間是建立於執行時堆疊上的。以前呼叫的函式的變數扔保留在堆疊上,但他們被新函式的變數所掩蓋,因此是不能被訪問的。

當遞迴函式呼叫自身時,情況於是如此。每進行一次新的呼叫,都將建立一批變數,他們將掩蓋遞迴函式前一次呼叫所建立的變數。當我追蹤乙個遞迴函式的執行過程時,必須把分數不同次呼叫的變數區分開來,以避免混淆。

程式中的函式有兩個變數:引數value和區域性變數quotient。下面的一些圖顯示了堆疊的狀態,當前可以訪問的變數位於棧頂。所有其他呼叫的變數飾以灰色的陰影,表示他們不能被當前正在執行的函式訪問。

假定我們以4267這個值呼叫遞迴函式。當函式剛開始執行時,堆疊的內容如下圖所示: 

執行除法之後,堆疊的內容如下:

接著,if語句判斷出quotient的值非零,所以對該函式執行遞迴呼叫。當這個函式第二次被呼叫之初,堆疊的內容如下:

堆疊上建立了一批新的變數,隱藏了前面的那批變數,除非當前這次遞迴呼叫返回,否則他們是不能被訪問的。再次執行除法運算之後,堆疊的內容如下:

quotient的值現在為42,仍然非零,所以需要繼續執行遞迴呼叫,並再建立一批變數。在執行完這次呼叫的出發運算之後,堆疊的內容如下:

此時,quotient的值還是非零,仍然需要執行遞迴呼叫。在執行除法運算之後,堆疊的內容如下:

不算遞迴呼叫語句本身,到目前為止所執行的語句只是除法運算以及對quotient的值進行測試。由於遞迴呼叫這些語句重複執行,所以它的效果類似迴圈:當quotient的值非零時,把它的值作為初始值重新開始迴圈。但是,遞迴呼叫將會儲存一些資訊(這點與迴圈不同),也就好是儲存在堆疊中的變數值。這些資訊很快就會變得非常重要。

現在quotient的值變成了零,遞迴函式便不再呼叫自身,而是開始列印輸出。然後函式返回,並開始銷毀堆疊上的變數值。

每次呼叫putchar得到變數value的最後乙個數字,方法是對value進行模10取餘運算,其結果是乙個0到9之間的整數。把它與字元常量『0』相加,其結果便是對應於這個數字的ascii字元,然後把這個字元列印出來。 

輸出4:

接著函式返回,它的變數從堆疊中銷毀。接著,遞迴函式的前一次呼叫重新繼續執行,她所使用的是自己的變數,他們現在位於堆疊的頂部。因為它的value值是42,所以呼叫putchar後列印出來的數字是2。

輸出42:

接著遞迴函式的這次呼叫也返回,它的變數也被銷毀,此時位於堆疊頂部的是遞迴函式再前一次呼叫的變數。遞迴呼叫從這個位置繼續執行,這次列印的數字是6。在這次呼叫返回之前,堆疊的內容如下:

輸出426:

現在我們已經展開了整個遞迴過程,並回到該函式最初的呼叫。這次呼叫列印出數字7,也就是它的value引數除10的餘數。

輸出4267:

然後,這個遞迴函式就徹底返回到其他函式呼叫它的地點。

如果你把列印出來的字元乙個接乙個排在一起,出現在印表機或螢幕上,你將看到正確的值:4267

遞迴工作原理

遞迴 recursion 就是子程式 或函式 直接呼叫自己或通過一系列呼叫語句間接呼叫自己,是一種描述問題和解決問題的基本方法。遞迴通常用來解決結構自相似的問題。所謂結構自相似,是指構成原問題的子問題與原問題在結構上相似,可以用類似的方法解決。具體地,整個問題的解決,可以分為兩部分 第一部分是一些特...

遞迴的原理

遞迴是經典演算法常用的方法,了解並掌握遞迴可以大大提公升你的程式編寫的能力。1 遞迴的條件 2 最簡單的遞迴 n的階層 3 遞迴的原理 遞迴的條件 遞迴要滿足4個條件 分別是 1函式必須有引數 2函式的引數必須改變,3函式必須呼叫自身,4函式有退出條件。最簡單的遞迴 n的階層 include int...

WITH遞迴原理

公用表表示式 cte common table expression with target column list as union all 定位點成員只是乙個返回有效關係結果表的查詢,與用於定義非遞迴表示式的查詢類似,定位點成員查詢只被呼叫一次。下面舉例理解遞迴原理 以下 演示了如何使用遞迴ct...