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

4

4 回答 4

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
任务完成。

于 2013-07-22T11:28:43.203 回答
1

通过以下函数实现,您将获得相同的结果:

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()调用发生赋值之前a,并且它的值在调用之前保持不变f(0)

于 2013-07-22T11:23:36.077 回答
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;会做。

于 2013-07-22T11:24:31.003 回答
0

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

于 2013-07-22T11:47:58.130 回答