【发布时间】:2013-08-25 03:14:20
【问题描述】:
请解释嵌套递归函数的返回调用如何一直传播到主函数?
我在一本书中遇到了以下代码段。 printf 输出是 '6, 12'
在递归函数sumdig()中,在第三次递归调用中调用return语句。
当 sumdig() 现在返回到第二个递归调用时, sumdig() 应该计算为 表达式,而不是 return 语句(即 return sumdig(n))。
但这似乎并非如此。递归函数的返回调用一直传播到 main。
谁能解释一下嵌套递归函数的返回调用是如何一直传播到main的?
如果递归调用类似于“return sumdig(n)”,那么下面的代码对我来说是有意义的。
main()
{
int a, b;
a = sumdig( 123 );
b = sumdig( 123 );
printf( "%d, %d\n", a, b);
}
sumdig(int n)
{
static int s = 0;
int d;
if(n != 0)
{
d = n % 10;
n = (n - d) / 10;
s = s + d;
sumdig(n);
}
else
return(s);
}
对 Sumdig 的递归调用
Initial call :n = 123, s = 0
First recursive call :n = 12, s = 3
Second recursive call :n = 1, s = 5
Third recursive call :n = 0, s = 6 // Return statement happens here
同样 对于第二次调用...静态变量将再次增加 6 变为 12。
如果我的问题不清楚,请帮我改进。
【问题讨论】:
-
sumdig 返回什么?一个整数?
-
您使用的是哪个编译器?编译过程中是否有警告?我得到这样的输出 4199344, 4199344
-
是的,我从书中提取了代码。 Sumdig 以旧式 K&R 格式声明。所以 return 是一个隐式 int。
-
在 linux 64 位上使用 gcc。没有警告。