我得到了输出 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)
这是代码。
我建议您在纸上写下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。