[英]Don't understand this recursion function
這是我讀過的書中的一個遞歸函數,因為它不是循環,該函數會打印出類似循環的輸出。 我試圖了解此函數up_and_down
工作方式。
在我讀過的書中,我說一個遞歸函數將其稱為self,但是在代碼中我無法直接看到它呢?
可以先謝謝一步,請一步一步解釋一下該功能是怎么回事。
#include<stdio.h>
void up_and_down(int);
int main(void){
up_and_down(1);
return 0;
}
void up_and_down(int n){
printf("Level %d: n location %p\n" , n , &n);
if(n < 4){
up_and_down(n+1);
}
printf("LEVEL %d: n location %p\n",n,&n);
}
輸出
級別1:n位置0x7ffd8988c9fc
級別2:n個位置0x7ffd8988c9dc
3級:n位置0x7ffd8988c9bc
級別4:n位置0x7ffd8988c99c
級別4:n位置0x7ffd8988c99c
級別3:n位置0x7ffd8988c9bc
級別2:n個位置0x7ffd8988c9dc
級別1:n位置0x7ffd8988c9fc
on top of the last context. 每次調用遞歸函數時,都會創建一個新上下文並將其在最后一個上下文之上。 該上下文存儲在堆棧中。
首次輸入up_and_down()
時(即: up_and_down(1)
),您具有以下上下文:
-----------
| LEVEL 1 |
-----------
上方的矩形表示調用up_and_down(1)
內部的上下文。
第二次遞歸調用此函數(即: up_and_down(2)
),上下文是:
-----------
| LEVEL 2 |
-----------
-----------
| LEVEL 1 |
-----------
對於第三個調用(即: up_and_down(3)
):
-----------
| LEVEL 3 |
-----------
-----------
| LEVEL 2 |
-----------
-----------
| LEVEL 1 |
-----------
(ie: up_and_down(4)
): 依此類推,直到n
等於 (即: up_and_down(4)
):
-----------
| LEVEL 4 |
-----------
-----------
| LEVEL 3 |
-----------
-----------
| LEVEL 2 |
-----------
-----------
| LEVEL 1 |
-----------
. 當n
等於時,函數up_and_down()
的if
語句第一次被評估為false。 因此,它不會發生任何其他遞歸調用(即,永遠不會發生up_and_down(5)
調用)。 for this recursive function. 因此, n == 4
被認為是該遞歸函數 。
執行流程以第二個printf()
繼續(即:顯示LEVEL 4
)。 然后,第四個調用的上下文被破壞:
-----------
| LEVEL 3 |
-----------
-----------
| LEVEL 2 |
-----------
-----------
| LEVEL 1 |
-----------
控制流程是從調用up_and_down(4)
返回的流程,即在具有由調用up_and_down(3)
創建的上下文的遞歸函數中(即,這次顯示LEVEL 3
)。
以下所有步驟類似地發生。
#include<stdio.h>
void up_and_down(int);
int main(void){
up_and_down(1);
return 0;
}
void up_and_down(int n){
printf("Level %d: n location %p\n" , n , &n);
if(n < 4){
up_and_down(n+1); // HERE : the function calls itself
}
printf("LEVEL %d: n location %p\n",n,&n);
}
該函數在主體中以整數作為參數調用。 從主n = 1調用它時,它將運行函數(up_and_down),並首次打印級別和位置。
n值為1且1 <4。然后它匹配條件,並且函數使用n +1作為參數調用自身; 它將再次運行該函數,但n = 2。
它將一直執行到n達到4為止,然后函數執行將繼續調用函數的其余部分(第二個printf)
如您所見,up_and_down稱為IN up_and_down函數
#include<stdio.h>
void up_and_down(int);
int main(void){
up_and_down(1); --> Step 1
return 0;
}
void up_and_down(int n){
printf("Level %d: n location %p\n" , n , &n); --> step 2
if(n < 4){ /* --> step3 checks if n is less than 4 */
up_and_down(n+1); /*--> step 4(if step3 is true) when if condition true this is executed */
}
printf("LEVEL %d: n location %p\n",n,&n); /* step5 irrespective of the if condition value of n is printed */
}
想象一下,您正站在通往房間的門前。 房間內還有一扇門,通向下一個房間,依此類推。
還要想象您拿着一支鉛筆和一張紙,其中包含要執行的操作說明:
步驟1:進入下一個房間。
步驟2:在紙上畫一個十字。
步驟3:計算所有十字架,然后大聲喊道:“我輸入了房間號[十字架數]”。
步驟4.1:如果您計算的交叉數少於或等於4,請轉到步驟1。
步驟4.2:如果您計算了4個或更多的十字架,請轉到步驟5。
步驟5:離開房間。
步驟6:從紙上擦除一個叉。
步驟7:數所有十字架,然后大聲喊出:“我有左房間號[十字架數]”,然后轉到步驟5。
當您再次到達起點時,您就完成了任務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.