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