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