C 我真的不知道';我不明白我们是怎么得到这些结果的

C 我真的不知道';我不明白我们是怎么得到这些结果的,c,C,有人能给我解释一下我们是怎么得到这个输出的吗 输出: Q B C D 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; } #包括

有人能给我解释一下我们是怎么得到这个输出的吗

输出:

Q
B C D
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;
}
#包括
char x='A';
虚无乐趣1(内部n){
如果(n>0)fun_1(n-3);
如果(n==0)printf(“Q\n”);
printf(“%c”,+x);
};
int main()
{
乐趣1(6);
返回0;
}
伙计们,有人能给我解释一下我们是怎么得到这个结果的吗

我能够复制:

% vi aaaa.c
[ code copied in the editor ]
% gcc aaaa.c
% ./a.out
Q
B C D
我希望这有帮助

(如果不是每个人都清楚的话,那是个笑话……)

您可以尝试在函数
fun\u 1
中添加printf。您可以看到,它被递归调用了3次,值为6、3和0


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

以下是将要进行的调用:

fun_1(n=6)//from main
    fun_1(n=3)//since 6 > 0 {
        fun_1(n=0){//now n is not greater than zero, so don't recurse
            execute if n == 0, yes it is, so output Q
            print ++x, x was A now after ++x, x would be 'B'
        }
        since n <> 0, don't output Q
        print ++x, x was B, so print C which is after pre-incrementing x
    }
    since n <> 0, don't output Q
    print ++x, x was C, so print D which is after pre-incrementing x
}
fun_1(n=6)//来自main
乐趣1(n=3)//因为6>0{
fun_1(n=0){//现在n不大于零,所以不要递归
如果n==0,则执行,是的,因此输出Q
print++x,x在++x之后是A,x将是“B”
}
因为n0,所以不输出Q
print++x,x是B,所以print C是在预加x之后
}
因为n0,所以不输出Q
print++x,x是C,所以print D是在预加x之后
}

您有一个递归函数,递归意味着它在某个点调用 它本身终端情况(当函数停止调用自身时)为
n==0

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

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

  • 递归级别1

    • 递归级别2

      因此,这是终端情况

    (返回至)

    递归级别1

(返回至)

递归级别0

现在递归调用已经结束,您回到
main
。如你所见 通过对递归级别的分析,生成的输出是

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

如果(n>0)fun_1(n-3)使用此语句,因为6>0,递归过程开始,6-3=3被发送回fun-1函数。但在这里,最重要的是要记住,在内存中创建的第一个函数并没有终止。对于每个递归步骤,将为新的n值创建新函数。所以在这里

printf(“%c”,+x)


此语句将使用相同数量的递归循环。因为您使用了预增量作为“++x”,所以字符值x='A'将首先递增,然后打印。因此,对于每个递归循环步骤,所有创建的函数都会通过一系列的创建终止,它们会将预先递增的值打印为输出。

递归……?或者将所有递归调用都写在纸上,包括它们生成的输出。或者使用调试器逐行遍历代码,逐步执行递归调用。是的,这就是他所说的输出。有什么帮助?
n == 3 ==> if(n>0) fun_1(n-3); is executed
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
printf("%c ", ++x);  is executed, x is now C, output is C
printf("%c ", ++x);  is executed, x is now D, output is D
Q
B C D
void fun_1(int n) {
if(n>0) fun_1(n-3);
if(n == 0 ) printf("Q\n");
printf("%c ", ++x);
};