【发布时间】:2013-07-22 11:07:37
【问题描述】:
#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 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() 调用发生在 before 分配到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) 字节。 您可能还需要为返回值添加一些字节。
【讨论】: