2 wujilei5 wujilei5 于 2016.03.07 22:28 提问

这个递归为什么输出少一位?
 #include <stdio.h>

void prints(char *p){
    if(*p != '\0') prints(++p);
    if(*p != '\0') printf("%c",*p);
}

int main(void){
    char p[] = "hello";
    prints(p);
    printf("\n");
    return 0;
}

程序运行结果如下:

F:\test>gcc -g -o test.exe test.c

F:\test>test.exe
olle

输入结果少了h,不理解为什么,求大神帮忙解释一下,在此跪谢!

6个回答

u013596119
u013596119   Rxr 2016.03.07 22:39
已采纳

这样就ok了,因为如果++p在先,下面一行打印的就是当前字符的下一个字符

 void prints(char *p){
    if(*p != '\0') printf("%c",*p);
    if(*p != '\0') prints(++p);

}
u013596119
u013596119 额。。原来要反序输出。。。
接近 2 年之前 回复
wujilei5
wujilei5 @caozhy的做法是对的,按你说的这样没能实现反序输出,谢谢~
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.03.07 22:35
 if(*p != '\0') prints(++p);
->
if(*p != '\0') prints(p + 1);
caozhy
caozhy   Ds   Rxr 2016.03.07 22:35
wujilei5
wujilei5 谢谢大神,理解了~
接近 2 年之前 回复
qq_29631069
qq_29631069   2016.03.07 22:37

第三行和第四行换一下
#include

void prints(char *p){
if(*p != '\0') printf("%c",*p);
if(*p != '\0') prints(++p);
}

int main(void){
char p[] = "hello";
prints(p);
printf("\n");
return 0;
}

wujilei5
wujilei5 谢谢~
接近 2 年之前 回复
qq_29631069
qq_29631069   2016.03.07 22:39

++p是先加后操作所以第一个被搞没了

wujilei5
wujilei5 明白了,谢谢~
接近 2 年之前 回复
John_ToStr
John_ToStr   Rxr 2016.03.08 16:29

#if 1
#include

void prints(char *p){
//正续
//if (*p != '\0') printf("%c", *p);
//if (*p != '\0') prints(++p);
//反序
if (*p != '\0') prints(++p);
if (*p != '\0') printf("%c", *p);
}

int main(void){
char p[] = " hello";
prints(p);
printf("\n");
return 0;
}

#endif

你要想通过递归反序输出也是可以的, 只不过要避免一下栈本身的缺陷

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!