不要理解这个递归函数

时间:2017-05-15 13:57:02

标签: c function recursion

这是我读过的一本书的递归函数,因为它不是一个循环,这个函数打印那些更喜欢它的循环。 我试图理解这个函数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

4 个答案:

答案 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步。

当你再次开始时,你已经完成了任务。