#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.我怀疑是如何使用堆栈内存。无法解密输出
#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 f(int n) {
if (n)
return n%10 + f(n/10);
return 0;
}
在你的情况的行为将是相同的,这就是为什么。首先,当初始化静态int变量时,它的默认值是0(与函数体内的int声明不同)。其次,n的唯一价值,当你的函数只需要a
值,不分配为0,因为当行a=n%10 + f(n/10)
评估,递归f()
调用发生以前分配a
,其价值之前f(0)
呼叫保持不变。
在每个递归调用f()
我表示n和用另外的 ' 所以 N = 12345,A = 5 N'= 1234,A” = 4 N ''= 123, ''= 3 '''=''='','''=''='''=''''='''''''=''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''是静态的)
答案是A + A” + A '' + ... = 15
注:a
不需要是静态的。 int a = 0;
会做。
让我们假设在该计算机:
int a
,设置为0(如静态)详细的堆栈使用情况依赖于编译器。但是我们可以粗略地说,对于函数f的每次调用,“int n”被压入栈中,因此占用int的大小。 如果您递归调用函数N次,则堆栈使用量将达到N * sizeof(int)个字节。 您也可能需要为返回值添加一些字节。