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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
扫描枪在Android 系统上面扫描的时候缺少一位,<已解决>百度输入法的问题
问题描述:扫描枪在Android 系统上面扫描的时候缺少一位, 在我们的系统中,当扫描枪扫描条码值“I-13388887777” 这样的条码的时候,总是缺少一位--手机号的第一位,得到的条码值是:“I-3388887777” 一开始我一位是扫描枪需要重新配置,因为我们的客户的扫码枪实在是太牛,所以研究了400多页的英文文档 最后当我们换了一个扫码枪的时候问题还是有的,所以我们判定不是扫码枪的配置的问题。 那么这个时候就判定是输入法的问题,这个时候客户的输入法是百度输入法,当他切换为其他的
递归求斐波那契(Fibonacci)数列某一位的值
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, ……这个数列的第N项应该是多少?private int  Fibonacci(int i){        if(i           return 0;        else if(i           return 1;        else         
ABAP中ALV导出excel表格时有个字段总是少一位
这是SAP的一个Bug,FM方式ALV Grid和Class ALV Grid都会出现,但是ALV List好像没有这个BUG。 在以下几个条件满足的时候就会出现这个问题: 1.字段对应的域Convers. routine = ALPHA,也就是有前导零的字段,比如供应商号、商品号、客户号等。 2.做ALV Fieldcat的时候,没有指定参考表和参考字段。 3.列的表头文本(seltext_s等)比实际显示的数据短。 所以解决问题的时候从2、3两点下手即可。
如何解决IMEI缺少最后一位的问题
IMEI(International Mobile Equipment Identity,移动设备国际识别码,又称为国际移动设备标识)是手机的唯一识别号码。本文将解决IMEI缺少最后一位校验位的问题。
输出1-100,不使用循环 goto 递归
今天去面试CVTE二面,面了这样一道题目,当时没有想出来,后来一回来就想到了,分享给大家 #include<iostream> using namespace std; class A { public: A() { cout << i++ << endl; } static int i; }; int A::i = 1; class MyClass
Java md5签名出现位数错误情况
md5签名位数问题少0的情况。
少用,尽量不用递归
递归说到底,就是自己调用自己,是一种无穷迭代思维方式,简单粗暴的罗列。 递归对程序员的修养要求极高,无穷递归、栈溢出,各种问题,安全性比较难把握。 来段快排递归: template void quick_sort(T a[], int low, int hign) { int first = low; int last = hign; int key = a[first]; if(
C语言逆向输出一个数组的所有值(递归和非递归)
使用递归和非递归逆向输出一个数组的所有元素非递归实现:例如:数组a为12345;逆质输出后为54321.#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;string.h&amp;gt;#define N 500  //表示宏定义,用500代替下面程序的N,可以根据自己的需要改 int main(void){ int i; char a[N+1]; gets(a);    //从键盘中...
0x5f3759df这个快速开方中的常数的数学依据和原理
Quake-III Arena (雷神之锤3)是90年代的经典游戏之一。   该系列的游戏不但画面和内容不错,而且即使计算机配置低,也能极其流畅地运行。这要归功于它3D引擎的开发者约翰-卡马克(John Carmack)。事实上早在90年代初DOS时代,只要能在PC上搞个小动画都能让人惊叹一番的时候,John Carmack就推出了石破天惊的Castle Wolfstein, 然后
为什么输出是这个?
public class graph{ public static void main(String arg[]){ String s1="fuck"; String s2=new String("fuck"); String s3="fuck"; System.out.println("s1==s2?------>" +