我有这段代码
#include <stdio.h>
void Funz(char *S);
int main()
{
char S[100] = "abcdefghilmnopq";
Funz(S);
return 0;
}
void Funz(char *S)
{
if ('\0' != S[0])
{
Funz(S+1);
printf("%c", *S);
}
}
我不确定为什么打印值的顺序相反,而不仅仅是&#34; q&#34;。
答案 0 :(得分:2)
Funz(S+1);
printf("%c", *S);
这是递归调用,之后执行printf
。为了打印每个子调用必须完成,然后执行printf
。这就是它反向打印的原因。
相反,如果你使用循环和迭代,那么你将只获得'q'
。
例如,让我们来一个简短的字符串"abc"
-
Funz(s[0]) (0
/ \
Funz(s[1])(1 'a' (6
/ \
Funz(s[2])(2 'b'(5
/ \
condition 'c'(4
false (3
执行顺序 - 0 1 2 3 4 5 6
答案 1 :(得分:2)
因为您在打印之前递归调用Funz(S)
。会发生的是递归最终在q
结束,因为它是空终止符之前的最后一个字母。
捕获并处理了null终止符异常后,它返回上一个函数框并打印该字符。
如果您希望按顺序打印,则需要打印字符然后递归它。
而不是像这样编码:
void Funz(char *S)
{
if ('\0' != S[0])
{
Funz(S+1);
printf("%c", *S);
}
}
您应将其编码为:
void Funz(char *S)
{
if ('\0' != S[0])
{
printf("%c", *S);
Funz(S+1);
}
}