c - 跟踪递归函数

标签 c recursion

以下程序的输出如下所示: n = 2 n = 1 n = 0 n = -1 n = 0 n = 1

我可以执行程序直到它打印出 n = -1,但为什么它返回并在最后打印 n = 0 和 n = 1?

#include <stdio.h>
void countdown (int n)
{

    printf("n = %d\t", n);

    n--;

    if (n >= 0)

    {

            countdown(n);

    }

    printf("n = %d\t", n);

}


int main()

{

    countdown(2);

    return 0;

}

最佳答案

函数中有两个printf,最后3个printfs(n = -1 n = 0 n = 1)在你的顺序 由第二个 printf 调用打印,这就是它再次上升的原因。你忘了那个。什么时候 递归结束,函数返回到上一级并继续 从那里开始。

最终n--n==0执行,n变为负数,n >= 0 是评价 为 false 并且 countdown(n) 不再执行。那是终端案例。 这意味着该函数停止调用自身并继续执行下一条语句,即第二条语句 printf,它将打印 n = -1

然后函数返回最后一个并继续执行第二个 printf 并得到 n = 0。然后函数结束,返回到第一个 级别,第二个 printf 被执行,你得到 n = 1。然后 函数返回到 main

如果您在递归中稍微更改 printf,您会看到 立即获得输出的原因。试试这个:

void countdown (int n)
{

    printf("[1] n = %d\n", n);

    n--;

    if (n >= 0)

    {

            countdown(n);

    }

    printf("[2] n = %d\n", n);

}

现在输出将是

[1] n = 2
[1] n = 1
[1] n = 0
[2] n = -1
[2] n = 0
[2] n = 1

关于c - 跟踪递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50071086/

相关文章:

c - 为什么函数类型冲突会在 Clang 中给出错误?

c - 如何使用 strcat() 连接字符串

c - 段错误(核心转储)和 zlib

javascript - 距索引 0 的 Levenshtein 距离

javascript - 是否可以使用隐藏/额外参数初始化变量?

haskell - 递归列表时出现非详尽模式错误

mysql - 如何使用 MySQL Workbench 查找字符串中多次出现的子字符串?

C - chmod() 不改变权限

c - GSL BLAS 函数所需的 "const gsl_vector_float"是什么?

c++ - 为什么这个递归调用以这种方式工作?