2013-07-22 93 views
1
#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.我怀疑是如何使用堆栈内存。无法解密输出

回答

1

你会与下面的函数实现得到相同的结果:

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)呼叫保持不变。

0

在每个递归调用f()我表示n和用另外的 ' 所以 N = 12345,A = 5 N'= 1234,A” = 4 N ''= 123, ''= 3 '''=''='','''=''='''=''''='''''''=''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''是静态的)

答案是A + A” + A '' + ... = 15

注:a不需要是静态的。 int a = 0;会做。

2

让我们假设在该计算机:

  • F(12345)
    • 使int a,设置为0(如静态)
    • 一个= 12345%10 + F(1234)
    • 笔记程序计数器,所以我们记得回来
      • F(1234)
      • 一个= 1234%10 + F(123)
      • 音符程序计数器,因此,我们记得在那里回来
        • F(123)
        • A = 123%10 + F(12)
        • 记程序计数器,因此,我们记得在那里回来
          • F(12)
          • A = 12%10 + F(1)
          • 音符程序计数器,因此,我们记得在那里回来
            • F(1)
            • 一个= 1%10 + F(0)
            • 音符程序计数器,因此,我们记得在那里回来
              • F(0)
              • 返回一个,即0(由于我们没有改变它尚未)
            • 返回一个= 1%10 + 0 = 1
          • 回报= 12%10 + 1 = 3
        • 返回A = 123%10 + 3 = 6
      • 回报= 1234%10 + 6 = 10
    • 回报= 12345%10 + 10 = 15
工作完成。

0

详细的堆栈使用情况依赖于编译器。但是我们可以粗略地说,对于函数f的每次调用,“int n”被压入栈中,因此占用int的大小。 如果您递归调用函数N次,则堆栈使用量将达到N * sizeof(int)个字节。 您也可能需要为返回值添加一些字节。