【问题标题】:Can't decipher the output无法破译输出
【发布时间】: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。我怀疑堆栈内存是如何使用的。

【问题讨论】:

    标签: c recursion static


    【解决方案1】:

    让我们假装是电脑:

    • f(12345)
      • 使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
    任务完成。

    【讨论】:

      【解决方案2】:

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

      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)调用之前保持不变。

      【讨论】:

        【解决方案3】:

        在每次递归调用 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; 可以。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2016-12-31
            • 1970-01-01
            • 2023-03-27
            • 1970-01-01
            • 2014-05-08
            • 1970-01-01
            • 1970-01-01
            • 2021-12-20
            • 2021-12-03
            相关资源
            最近更新 更多