用递归函数反向输出字符串

mediam2000 2008-11-07 05:07:10
#include<stdio.h>

void reverse(const char *const sPtr);

/* 用递归函数反向输出字符串 */
int main()
{
char sentence[80];

/* 输入字符串,并存入字符数组sentence内 */
printf("Enter a line of text:\n");
gets(sentence);

/* 调用递归函数反向输出字符数组sentence内的字符 */
printf("the line printed backwack is:\n");
reverse(sentence);

getch();
}
/*递归反向输出字符串*/
void reverse(const char *const sPtr)
{
if(sPtr[0] == '\0')
return;
else{
reverse(&sPtr[1]);
putchar(sPtr[0]);
}
}

请教:此段递归程序是如何执行反向输出字符数组内的字符的?
...全文
2244 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
deerwin1986 2008-11-08
  • 打赏
  • 举报
回复
就是栈 先都PUSH 最后再全POP出来啊
踏岸寻柳 2008-11-07
  • 打赏
  • 举报
回复
不错的代码啊!

采用递归,然后输出第一个字符。
由于递归是最后面的先执行,所以,一层一层的都是第一个字符最后输出,就可以得到反向输出的字符串了。

shailen126 2008-11-07
  • 打赏
  • 举报
回复
笔误?貌似误的地方太多了。。
reverse(const char *const sPtr) 递归次数 是否为'/0' 输出内容
&sPtr[0] 字符为'H' 1 no H
&sPtr[1] 字符为'e' 2 no eH
&sPtr[2] 字符为'l' 3 no leH
&sPtr[3] 字符为'l' 4 no lleH
&sPtr[4] 字符为'o' 5 no olleH
&sPtr[5] 字符为'/0' 6 YES olleH
//&sPtr[0]是一个空间地址,此时只存一个“H”?
//再说输出内容,按照你的思路最后输出显示的应该是 “olleHlleHleHeHH”
  • 打赏
  • 举报
回复
只是笔误,怎么能说误解。。。
程序总体执行步骤分析没问题
shailen126 2008-11-07
  • 打赏
  • 举报
回复
char sPtr[] = "hello";

reverse(const char *const sPtr) 递归次数 是否为'/0' sPtr[0]的中值 输出内容
&sPtr[0] 指向内存数据为'Hello' 1 no H H
&sPtr[1] 指向内存数据为'ello' 2 no e e
&sPtr[2] 指向内存数据为'llo' 3 no l l
&sPtr[3] 指向内存数据为'lo' 4 no l l
&sPtr[4] 指向内存数据为'o' 5 no o o //第一个输出
&sPtr[5] 指向内存数据为'/0' 6 YES 语句未执行无值
shailen126 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 iamaitman 的回复:]
比如输入的字符串为:Hello
程序执行的过程如下:
sPtr[0]='H',sPtr[1]='e',sPtr[2]='l',sPtr[3]='l',sPtr[4]='o',sPtr[5]='/0'

reverse(const char *const sPtr) 递归次数 是否为'/0' 输出内容
&sPtr[0] 字符为'H' 1 no H
&sPtr[1] 字符为'e' 2 no eH
&sPtr[2] 字符为'l' 3 no leH

[/Quote]
楼上误解。。。
  • 打赏
  • 举报
回复
比如输入的字符串为:Hello
程序执行的过程如下:
sPtr[0]='H',sPtr[1]='e',sPtr[2]='l',sPtr[3]='l',sPtr[4]='o',sPtr[5]='/0'

reverse(const char *const sPtr) 递归次数 是否为'/0' 输出内容
&sPtr[0] 字符为'H' 1 no H
&sPtr[1] 字符为'e' 2 no eH
&sPtr[2] 字符为'l' 3 no leH
&sPtr[3] 字符为'l' 4 no lleH
&sPtr[4] 字符为'o' 5 no olleH
&sPtr[5] 字符为'/0' 6 YES olleH



shailen126 2008-11-07
  • 打赏
  • 举报
回复
不知道怎么说才明白,
通过递归putchar(sPtr[0]); 中的sPtr[0]会定位字符串中从头到尾的每一个字符,但是由于reverse(&sPtr[1]); 没有执行完,putchar(sPtr[0]); 还不会执行,所以暂不会有输出,直到 reverse(&sPtr[1]); 中的sPtr[1]缩短到最后一个"\0“字符,执行RETURN,上一级函数的 reverse(&sPtr[1]); 语句就执行完了,所以putchar(sPtr[0]); 会输出sPtr[0]); 即最后一个字符,以此逆推,将倒序输出所有字符。。。楼主如还不明白,去VC中单步调试下就很明了了
wyswyg63 2008-11-07
  • 打赏
  • 举报
回复
当未到字符串结尾的时候。所有的递归函数都阻塞在这一句reverse(&sPtr[1]);
当最后返回回的时候,假设字符串长度为n,那么reverse(&sPtr[n])先返回,然后reverse(&sPtr[n-1])返回,依次下去,就反向输出了
yzfyzyl 2008-11-07
  • 打赏
  • 举报
回复
假设sPtr由两部分组成:AZ
A表示第1个字符,Z表示它后面的

假如我们要输出ZA,就先输出后面的Z,再输出前面的A
假如后面的Z做同样的操作,拆成BY,B是Z的第一个字符
假如我们要输出BY,就先输出后面的Y,再输出前面的B


void reverse(const char *const sPtr)
{
if(sPtr[0] == '\0') //结束条件(边界条件)
return;
else{
reverse(&sPtr[1]); //反向输出后面剩下的Z
putchar(sPtr[0]); //补回前面的A
}
}



飞燕算法群:46520219
minorcxx 2008-11-07
  • 打赏
  • 举报
回复
一层层推出

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧