请解释嵌套递归函数的返回调用如何一直传播到main?
我在一本书中遇到了以下代码段。 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。
如果我的问题不明确,请帮我改进。
答案 0 :(得分:2)
返回值未定义,因为只有最里面的递归调用返回定义的值s
。以前对sumdig()
的所有调用都返回一个未定义的值,因为当sumdig返回时没有完全填充if`子句,即当它从递归调用返回时,没有return语句。
所以可能是,如果寄存器中的返回值保持不变,s
会被传播回去,这可能是,也可能不是。
为安全起见,递归调用应为:
return sumdig(n);
答案 1 :(得分:1)
这是非常旧的样式C.函数的返回值将是函数中最后一次求值的结果(在本例中为sumdig())。
答案 2 :(得分:1)
你的问题本身就有答案。静态变量s
更新了每个递归,如果条件为false,则仅时间函数返回main。因此,s
的上次更新值将返回main。