这是我读过的一本书的递归函数,因为它不是一个循环,这个函数打印那些更喜欢它的循环。
我试图理解这个函数up_and_down
是如何工作的。
在我读过的书中,它说一个递归函数称之为自己,但在代码中我不能直接看到它如何?
有些人可以提前解释一下这个步骤,以及事先感谢功能。
#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
LEVEL 3:n位置0x7ffd8988c9bc
LEVEL 2:n位置0x7ffd8988c9dc
LEVEL 1:n位置0x7ffd8988c9fc
答案 0 :(得分:1)
每次调用递归函数时,都会创建一个新的上下文,并在最后一个上下文之上堆积。该上下文存储在堆栈中。
在第一次进入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 |
-----------
依此类推,直到n
等于 4 (即:up_and_down(4)
):
-----------
| LEVEL 4 |
-----------
-----------
| LEVEL 3 |
-----------
-----------
| LEVEL 2 |
-----------
-----------
| LEVEL 1 |
-----------
当if
等于 4 时,函数up_and_down()
中的n
语句首次被评估为false。
因此,它不会发生任何额外的递归调用(即:调用up_and_down(5)
永远不会发生)。
出于这个原因,n == 4
被认为是这个递归函数的退出条件。
执行流程继续第二个printf()
(即显示LEVEL 4
)。然后第四个调用的上下文被破坏:
-----------
| LEVEL 3 |
-----------
-----------
| LEVEL 2 |
-----------
-----------
| LEVEL 1 |
-----------
控制流是从调用up_and_down(4)
返回的控制流,即在具有由调用up_and_down(3)
创建的上下文的递归函数中(即:LEVEL 3
此时显示)。
以下所有步骤都类似。
答案 1 :(得分:0)
#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);
}
函数在main中以整数作为参数调用。当它从主n = 1调用时,它运行函数(up_and_down),第一次打印水平和位置。
n值为1且1 <1。然后它匹配条件,函数使用n + 1作为参数调用自身;它将再次运行该函数,但n = 2。
直到n达到4才会这样做 然后函数执行将继续调用函数的其余部分(第二个printf)
你可以看到up_and_down被称为IN up_and_down函数
答案 2 :(得分:0)
#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 */
}
答案 3 :(得分:0)
想象一下,你正站在通往房间的门前。房间还有一扇门,通往隔壁房间等等。
还可以想象你拿着一支铅笔和一张纸,上面有你要做的说明:
第1步:进入下一个房间。
步骤2:在纸上画一个十字架。
步骤3:计算所有十字架并大声喊出:“我已经输入房间号[十字架数]”。
步骤4.1:如果您计算的小于或等于4个十字架,请转到步骤1.
步骤4.2:如果您计算了4个或更多个十字架,请转到步骤5.
第5步:离开房间。
步骤6:从纸上擦掉一个十字架。
步骤7:计算所有十字架并大声喊出:“我有左侧房间号码[十字架数量]”并转到第5步。
当你再次开始时,你已经完成了任务。