#include<stdio.h>
int f(int n)
{
static int a;
if(n)
a=n%10+f(n/10);
return a;
}
int main()
{
printf("%d",f(12345));
}
输出为 15。我怀疑堆栈内存是如何使用的。
让我们假装是计算机:
int a
,设置为 0(作为静态)通过以下函数实现,您将获得相同的结果:
int f(int n) {
if (n)
return n%10 + f(n/10);
return 0;
}
在您的情况下,行为将是相同的,这就是原因。首先,当您初始化静态 int 变量时,它的默认值为 0(与仅在函数体内声明 int 不同)。其次,当你的函数只a
取值而不给它赋值时,n 的唯一值是 0,因为当行a=n%10 + f(n/10)
评估时,递归f()
调用发生在赋值之前a
,并且它的值在调用之前保持不变f(0)
。
在每次递归调用时,f()
我都表示 n 并附加 ' 所以 n = 12345, a = 5 n' = 1234, a' = 4 n'' = 123, a'' = 3 n''' = 12, a'' '= 2 n'''' = 1, a'''' = 1 n''''' = 0, a''''' = 0(因为a是静态的)
答案是 a + a' + a'' + .... = 15
注意:a
不需要是静态的。int a = 0;
会做。
详细的堆栈使用取决于编译器。但是我们可以粗略地说,对于函数 f 的每次调用,“int n”都被压入堆栈,从而占用了一个 int 的大小。如果递归调用函数 N 次,则堆栈使用量达到 N*sizeof(int) 字节。您可能还需要为返回值添加一些字节。