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

void recursie(int);

int main(int argc, char **argv) {
  recursie(3);
}

void recursie(int a){
  if(a==0){return;}
    recursie(a-1);
    printf("%d",a);
    recursie(a-1);
}

输出是:1213121。有人能解释一下我是如何得到这个输出的吗?

4

4 回答 4

8
recursie(3)
  -calls recursie(2)
   - calls recursie(1)
     -calls recursie(0) -> void
     -prints 1
     -calls recursie(0) -> void
   -prints 2
   -calls recursie 1
      -calls recursie 0 -> void
      -prints 1
      -calls recursie 0 -> void
  -prints 3
  -calls recursie(2)
   - calls recursie(1)
     -calls recursie(0) -> void
     -prints 1
     -calls recursie(0) -> void
   -prints 2
   -callse recurse 1
      -calls recusie 0 -> void
      -prints 1
      -calls recursie 0 -> void
end
于 2012-08-25T13:46:50.547 回答
2

发生这种情况是因为递归发生的顺序相对于prinf(). 如果您计算出调用的顺序,请忽略它,recursie(0)因为它是一个无操作(什么都不做)并将它们展平为一个简单的语句列表,您得到的是:

recursie(3-1);
printf("%d", 3);
recursie(3-1);

这导致:

recursie(2-1);
printf("%d", 2);
recursie(2-1);
printf(3);
recursie(2-1);
printf("%d", 2);
recursie(2-1);

反过来,结果如下:

printf("%d", 1);
printf("%d", 2);
printf("%d", 1);
printf("%d", 3);
printf("%d", 1);
printf("%d", 2);
printf("%d", 1);
于 2012-08-25T13:46:57.577 回答
1

调用它的输出是被调用它的输出的两个副本包围n的字符串,除了调用它的输出什么都没有。这意味着调用它的输出是,所以调用它的输出是(被副本包围),调用它的输出是(被两个副本包围)。nn-101"1"2"121""2""1"3"1213121""3""121"

于 2012-08-25T13:48:14.117 回答
0

当像这样的新概念看起来令人困惑时,拿一张笔记本纸,把所有的东西都画出来。您会看到数字 3 位于中心的原因是您在其打印的两侧运行两个递归函数,为 3 留下相等的填充位于中心。接下来是 2 留在其填充(1)的中心。这与 3 位于中心的原因相同。1 在两边,没有 0,因为你说if 0, stop

是否有您正在寻找但未实现的特定结果?

于 2012-08-25T13:47:52.977 回答