wujilei5
睡成双眼皮
采纳率100%
2016-03-07 14:28 阅读 1.4k
已采纳

这个递归为什么输出少一位?

 #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 u52983610 2016-03-07 14:39

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

     void prints(char *p){
        if(*p != '\0') printf("%c",*p);
        if(*p != '\0') prints(++p);
    
    }
    
    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2016-03-07 14:35
    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2016-03-07 14:35
     if(*p != '\0') prints(++p);
    ->
    if(*p != '\0') prints(p + 1);
    
    点赞 评论 复制链接分享
  • qq_29631069 JonyShan 2016-03-07 14: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;
    }

    点赞 评论 复制链接分享
  • qq_29631069 JonyShan 2016-03-07 14:39

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

    点赞 评论 复制链接分享
  • John_ToStr John_ToDebug 2016-03-08 08: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

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

    点赞 评论 复制链接分享

相关推荐