FanXing3 发表于 2023-7-9 11:52:20

请问这个递归为什么打印出来是54321001234

#include <stdio.h>

void up_and_down(int n);

void up_and_down(int n)
{
      printf("%d ", n);
      if (n > 0)
      {
                up_and_down(--n);
      }
      printf("%d ", n);
}

int main(void)
{
      int n;

      printf("请输入一个整数:");
      scanf("%d", &n);

      up_and_down(n);
      putchar('\n');

      return 0;
}
可以模拟下他的打印过程吗,不懂为什么后面还会有1 2 3 4

陶远航 发表于 2023-7-9 11:52:33

这段代码实现了一个递归函数 up_and_down ,它通过递归的方式打印从输入整数n到 0 的序列,并在最后再打印一次0。

我将为您模拟一下该代码的执行过程:

首先,假设输入整数为 5(即n = 5 )。

进入main函数,输出提示信息并等待用户输入。

用户输入5 ,然后进入up_and_down(5) 。

在up_and_down函数中,首先打印当前值5 ,然后进行判断。

由于n > 0成立,因此执行up_and_down(4) 。

在up_and_down(4)中,同样打印当前值4 ,然后进行判断。

再次执行up_and_down(3) 、 up_and_down(2) 、 up_and_down(1) ,都是同样的操作。

当执行up_and_down(0)时,由于n > 0不成立,所以不再递归调用自身。

此时,回到up_and_down(1) ,继续执行下面的语句printf("%d ", n); ,输出1 。

然后返回到up_and_down(2) ,继续打印2 。

依次类推,打印出3 、 4 。

最后回到up_and_down(5) ,再次执行printf("%d ", n); ,输出0 。

整个递归过程结束,输出结果为: 5 4 3 2 1 0 。

最后,为什么还会有1 2 3 4的输出呢?这是因为在每次递归调用up_and_down函数之前都会打印当前的值n ,所以每个递归调用返回时都会继续执行后面的printf("%d ", n);语句。这就是为什么在输出完5到0的序列后,还会输出1 2 3 4 。

希望我的解释能帮到您!如果还有其他问题,请随时提问。

isdkz 发表于 2023-7-9 12:24:53

这是因为递归的性质。在递归函数中,当满足递归条件时,函数会一直调用自身,但是当递归条件不满足时,递归会开始回溯(即函数开始返回到前一级的状态)。在你的代码中,每次进入函数时,首先打印出传入的参数n,然后如果n大于0,函数就会调用自己并传入n-1。当n不再大于0时,开始回溯并再次打印n。这时候,函数回溯到上一级,n又变回原来的值,所以你看到的结果是先递减然后再递增。

我们可以通过下面的例子来模拟下这个过程:

假设你输入的整数n是5,那么函数的调用栈和打印结果将如下:

up_and_down(5)-> printf "5 ", up_and_down(4), printf "5 "
up_and_down(4)-> printf "4 ", up_and_down(3), printf "4 "
up_and_down(3)-> printf "3 ", up_and_down(2), printf "3 "
up_and_down(2)-> printf "2 ", up_and_down(1), printf "2 "
up_and_down(1)-> printf "1 ", up_and_down(0), printf "1 "
up_and_down(0)-> printf "0 ", printf "0 "


从上到下就是递归的深入过程,打印出的是5 4 3 2 1 0,而从下到上就是递归的回溯过程,打印出的是0 1 2 3 4 5。这样就构成了你看到的 "543210012345"。

也就是说,递归函数在递归调用之前和之后,分别对n进行了打印,这就是为什么你会看到一次递减和一次递增。
页: [1]
查看完整版本: 请问这个递归为什么打印出来是54321001234