有人可以向我解释我们是如何得到这个输出的?
输出:
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;
}
答案 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;将首先递增然后打印。因此,对于每个递归循环步骤,创建的所有函数都由创建序列终止,并且它们在输出中打印预递增的值。