为什么这个程序的输出是312213444而不是3122134?

时间:2017-03-29 07:08:45

标签: c data-structures

在给出的代码中,我能想到的输出是3122134,因为当n = 1时,最后一个printf语句只执行一次。因此条件变为1> 1,这肯定不是真的并且循环退出并且执行最后的printf语句。但原始输出是312213444.为什么会这样?我哪里错了?请解释每一个概念和实例?

 #include <stdio.h>
 void count (int n)
 {
 static int d=1;

 printf("%d", n);
 printf("%d", d);
 d++ ;
 if(n>1)
 count(n-1);
 printf("%d", d);
 }

 void main ()
 {
 count(3);
 }

2 个答案:

答案 0 :(得分:3)

重写您的printf()语句(并修正您的main声明),例如改编为

#include <stdlib.h>
#include <stdio.h>

void count(int n)
{
    static int d=1;

    printf("A) n = %d\n", n);
    printf("B) d = %d\n", d);
    d++;
    if (n>1)
        count(n-1);
    printf("C) d = %d\n", d);
}

int main(void)
{
    count(3);

    return EXIT_SUCCESS;
}

编译并运行代码,查看输出,你就应该明白了。

一种可以帮助解开递归函数的技术是将几个递归调用解包到单独的函数中。在这里,main()调用count(3),它执行递归调用count(2),执行递归调用count(1)。我们可以通过重复三次函数来将这些递归调用更改为对单独函数的调用。我们确实需要将d变量更改为全局变量,以便每个功能副本使用相同的副本,而不是恰好具有相同名称的单独副本。

#include <stdlib.h>
#include <stdio.h>

int d = 1;

void count1(void)
{
    int n = 1;
    printf("count1(): A) n = %d\n", n);
    printf("count1(): B) d = %d\n", d);
    d++;
    /* The following is never true, so
       we comment it out:
      if (n>1)
          count0();
    */
    printf("count1(): C) d = %d\n", d);
}

void count2(void)
{
    int n = 2;
    printf("count2(): A) n = %d\n", n);
    printf("count2(): B) d = %d\n", d);
    d++;
    if (n>1)
        count1();
    printf("count2(): C) d = %d\n", d);
}

void count3(void)
{
    int n = 3;
    printf("count3(): A) n = %d\n", n);
    printf("count3(): B) d = %d\n", d);
    d++;
    if (n>1)
        count2();
    printf("count3(): C) d = %d\n", d);
}

int main(void)
{
    count3();

    return EXIT_SUCCESS;
}

在这种特殊情况下,解开递归函数应该有助于理解控制流。 (具体来说,当你调用另一个函数,并且函数返回时,在函数调用之后的语句中,调用者继续执行。)

答案 1 :(得分:0)

当您递归调用函数

  

计数()

您将每次调用count()放在应用程序的堆栈上。在最后一次计数调用结束后,你将返回最后一次count计数,它还会再次打印静态变量d(仅初始化一次),依此类推,直到堆栈最终位于顶部,然后返回到main方法。这就是你输出中最后两个'4'的原因。