无法破译输出

时间:2013-07-22 11:07:37

标签: c recursion static

#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.我怀疑是如何使用堆栈内存。

4 个答案:

答案 0 :(得分:2)

让我们假装成电脑:

  • F(12345)
    • make int a,设置为0(作为静态)
    • a = 12345%10 + f(1234)
    • 注意程序计数器,所以我们记得在哪里回来
      • F(1234)
      • a = 1234%10 + f(123)
      • 注意程序计数器,所以我们记得在哪里回来
        • F(123)
        • a = 123%10 + f(12)
        • 注意程序计数器,所以我们记得在哪里回来
          • F(12)
          • a = 12%10 + f(1)
          • 注意程序计数器,所以我们记得在哪里回来
            • F(1)
            • a = 1%10 + f(0)
            • 注意程序计数器,所以我们记得在哪里回来
              • F(0)
              • 返回a,即0(因为我们尚未更改)
            • 返回a = 1%10 + 0 = 1
          • 返回a = 12%10 + 1 = 3
        • 返回a = 123%10 + 3 = 6
      • 返回a = 1234%10 + 6 = 10
    • 返回a = 12345%10 + 10 = 15
完成工作。

答案 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)字节。 您也可能需要为返回值添加一些字节。