簡體   English   中英

不了解此遞歸功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM