我真的不知道如何得到这些输出

时间:2018-04-14 14:36:45

标签: c

有人可以向我解释我们是如何得到这个输出的?

输出:

Q
B C D

这是我的代码:

#include <stdio.h>
char x = 'A';
void fun_1(int n) {
    if(n>0) fun_1(n-3);
    if(n == 0 ) printf("Q\n");
    printf("%c ", ++x);
};

int main()
{
    fun_1(6);    
    return 0;
}

4 个答案:

答案 0 :(得分:1)

你有一个递归函数,递归意味着它在某些时候调用 本身。终端案例(当函数停止调用时)是n == 0

在处理递归函数时,你必须这样思考:

递归级别0 (第一次调用)

n == 6 ==> if(n>0) fun_1(n-3); is executed
  • 递归级别1

    n == 3 ==> if(n>0) fun_1(n-3); is executed
    
    • 递归级别2

      n == 0 ==>
          if(n == 0 ) printf("Q\n");  is executed, output is "Q\n"
      
          printf("%c ", ++x);         is executed, x is now B, output is B
      

      这是终端案例,因此

    (返回)

    递归级别1

    printf("%c ", ++x);  is executed, x is now C, output is C
    

(返回)

递归级别0

printf("%c ", ++x);  is executed, x is now D, output is D

现在递归调用已经结束,你回到main。如你看到的 从递归级别的分析来看,生成的输出是

Q
B C D

答案 1 :(得分:0)

  

伙计们有人可以向我解释我们是如何得到这个输出的?

我能够重现:

% vi aaaa.c
[ code copied in the editor ]
% gcc aaaa.c
% ./a.out
Q
B C D

我希望有所帮助!

(这是一个笑话,如果不是每个人都不清楚......)

您可以尝试在函数fun_1中添加printf。你会看到它被递归调用3次,值为6,3和0。

最后一个调用将打印Q然后打印B.然后第二个调用将打印C,第一个调用将打印D.

答案 2 :(得分:0)

以下是将要进行的调用:

template<class T> struct A{
   int f() { return 1; }
}

template<>
int A<int>::f() { return 2; }                            //(3)

答案 3 :(得分:0)

void fun_1(int n) {
if(n>0) fun_1(n-3);
if(n == 0 ) printf("Q\n");
printf("%c ", ++x);
};

在main函数中第一次调用此方法时,您发送 6 的值。

if(n> 0)fun_1(n-3)此语句,因为6> 0,启动递归过程并发送6-3 = 3 回到 fun-1 功能。但是在这里,最重要的是要记住,在内存中创建的第一个函数不会终止。对于每个递归步骤,将为新的 n 值创建新函数。所以在这里;

  

printf(&#34;%c&#34;,++ x);

这个语句将使用相同数量的递归循环。因为您使用了预增量作为&#34; ++ x&#34; ,所以char值x =&#39; A&#39;将首先递增然后打印。因此,对于每个递归循环步骤,创建的所有函数都由创建序列终止,并且它们在输出中打印预递增的值。