鱼C论坛

 找回密码
 立即注册
查看: 1905|回复: 2

[已解决]请问这个递归为什么打印出来是54321001234

[复制链接]
发表于 2023-7-9 11:52:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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 。

希望我的解释能帮到您!如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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 。

希望我的解释能帮到您!如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

  1. up_and_down(5)  -> printf "5 ", up_and_down(4), printf "5 "
  2. up_and_down(4)  -> printf "4 ", up_and_down(3), printf "4 "
  3. up_and_down(3)  -> printf "3 ", up_and_down(2), printf "3 "
  4. up_and_down(2)  -> printf "2 ", up_and_down(1), printf "2 "
  5. up_and_down(1)  -> printf "1 ", up_and_down(0), printf "1 "
  6. up_and_down(0)  -> printf "0 ", printf "0 "
复制代码


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

也就是说,递归函数在递归调用之前和之后,分别对n进行了打印,这就是为什么你会看到一次递减和一次递增。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 09:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表