我想知道以下代码如何工作的详细信息

Nat*_*elk 0 c recursion

我得到了输出 00246,但我不明白代码,有人可以详细说明一下吗?

int print(int nb)
{
    if (nb < 0) 
    {
        return (0);
    }
    printf("%d", nb + print(nb - 1));
    nb --;
    return (nb);
}

int main(void)
{
    print(4);
    return (0);
}
Run Code Online (Sandbox Code Playgroud)

这是代码。

Chr*_*sBD 6

我建议您在纸上写下nb出现的不同值。

请注意,在调用返回值printf("%d", nb + print(nb - 1))之前,不会调用此行中的 print 函数 。print(nb-1)最终,这意味着打印的第一个值将来自最后一层递归。

对代码的更改可以向您展示其工作原理:

    int print(int nb, int level)
    {
        printf("\nEnter level %d nb= %d", level, nb);
        if (nb < 0) 
        {
            printf("\nExit level %d nb =%d return 0", level, nb);
            return (0);
        }
        printf("\nOriginal Output  level %d nb=%d",level, nb + print(nb - 1, level+1));
        nb --;
        printf("\nExit level %d nb=%d", level, nb);
        return (nb);
    }
    
    int main(void)
    {
        int level=0;
        print(4, level);
        return (0);
    }
Run Code Online (Sandbox Code Playgroud)

输出为:

Enter level 0 nb= 4
Enter level 1 nb= 3
Enter level 2 nb= 2
Enter level 3 nb= 1
Enter level 4 nb= 0
Enter level 5 nb= -1
Exit level 5 nb =-1 return 0
Original Output level 4 nb=0
Exit level 4 nb=-1
Original Output level 3 nb=0
Exit level 3 nb=0
Original Output level 2 nb=2
Exit level 2 nb=1
Original Output level 1 nb=4
Exit level 1 nb=2
Original Output level 0 nb=6
Exit level 0 nb=3
Run Code Online (Sandbox Code Playgroud)

在更改后的代码中,我添加了一个变量level,该变量为每个递归级别标记一个数字。

如果您按照代码查看输出,您可以看到顶层nb以值 开头4

printf("\nOriginal Output level %d nb=%d",level, nb + print(nb - 1, level+1)); 在您调用函数的行中 print,这将带您进入下一个递归级别,其中 Entrynb为 3。

此时该printf语句尚未被调用,因为代码需要函数的返回值print

代码会一直运行,直到我们再次调用print,代码才会进入下一个递归级别。

每次print调用该点的所有局部变量值,并将指向函数调用位置的指针放置在堆栈上,以便代码流在完成后可以返回到调用的位置。

这个循环一直持续到第 5 层,其中nb小于 0,因此代码返回值 0,它没有到达printf该层的语句,因此 的值0返回到print第 4 层调用函数的位置。这是通过使用然后删除放置在堆栈上的数据来完成。

printf现在可以运行调用,因为我们有从函数调用返回的值print。此时 的本地值为0,如输出中的nb语句所示。Enter level 4 nb= 0这个本地值被添加到调用printie 0, 0+0=0 的返回值中,所以你会看到:

Original Output level 4 nb=0

printf该级别的代码完成后nb递减,返回 的值-1

Exit level 4 nb=-1

堆栈再次回滚一级,现在在第 3 级,返回值 -1 被添加到nb( Enter level 3 nb= 1) 的第 3 级值,1-1=0,因此输出为printf

Original Output level 3 nb=0

循环继续,直到所有堆栈级别都已回滚。输出显示了放置在堆栈上的直到级别 5 的所有阶段,以及从那里回滚的所有阶段,直到我们回到级别 0。

  • 添加了更多解释。永远不要低估简单的“printf”语句的价值,它有助于在运行时理解代码,而不需要使用调试器来停止程序流程。 (2认同)