正文

[074] 字符串逆序输出(递归)(发表时间: 2006-11-19 22:18:00)

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wentao/20500.html 复制链接

分享到:

标签:递归 

《C程序设计》(夏宝岚)



[相关]  [053] 字符串逆序输出 。

编写递归函数,实现将输入的字符串以倒序输出。


#include <stdio.h>
void revers()
{
    char c;
    if((c = getchar()) != '\n')
        revers();
    if(c != '\n')
        putchar(c);
}

void main()
{
    revers();
    printf("\n");
}

运行结果(VC):
=================
I am a student↙
tneduts a ma I
=================

★ 仔细“品”一下这个题目会发现很意思,特别是对理解递归的执行流程很有帮助(随便找一本C语言的书,都会找到执行流程的示意图)。不容易理解的就是那句putchar(c); 乍一看好像是输入回车后只会把最后的一个字符(即回车符)输出,而做了c!='\n'的限制后就应该什么都不输出才对,其实这正是递归的实质所在。

递归在编译系统里是通过堆栈来实现的,即如果函数当前层不满足结束条件,就会再次调用其本身,在调用之前,编译系统会为函数代码、形参以及函数中定义的局部变量在堆栈中分配单元,即将这些信息暂时存储起来,下一层函数若仍不满足结束条件,则重复此过程,继续将信息存储在系统堆栈中。在本题中,每一层输入的字符都已经存储在了堆栈中。当满足结束条件时,从最后层堆栈开始回归,一层层的返回。此题中从最后输入的回车符开始返回,完成了逆序将堆栈中存储的字符输出。

可能某些用词并不准确,不过我想我的理解应该没错^_^

阅读(5090) | 评论(7) | 复制链接


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

评论人: 匿名 发布时间: 2011-4-11 10:33:00
楼主((c = getchar()) != '\n' )没错,其实这句话相当于做了2件事,先把getchar()赋给c,再判断c是否为'\n'.和  
    char c = getchar();
    if(c != '\n')不是一回事吗?

评论人: liudd 发布时间: 2009-8-28 10:04:00
if ( ( c = getchar() ) != '\n' )
        revers() ;
    else
        return ;
这个判断语句,条件不满足时else return;返回的是什么值?为什么后面直接putchar();
不需要判断是否是回车呢?
评论人: gaogzh 发布时间: 2008-11-20 16:08:00
嬿·嘄·骊·戨的程序更简洁
评论人: 嬿·嘄·骊·戨 发布时间: 2008-10-11 0:05:00
JamesWu
人家的程序没问题``是你没明白 `

void revers()
{
    char c;

    if ( ( c = getchar() ) != '\n' )
        revers() ;
    else
        return ;

    putchar(c);
}



评论人: wentao 发布时间: 2008-1-5 0:29:00
我的运行结果可不是凭空想出来的,都是真正运行过我烤出来的,通不过的话多数都和编译器有些关系,我当时好像用的VC6.0的环境,好久没弄,记不清了,呵呵。
评论人: JamesWu 发布时间: 2008-1-1 20:06:00
楼主您的程序有错。
(c = getchar()) != '\n' 好像永远都为真吧?

修改:
    ......
    char c = getchar();
    if(c != '\n')
         revers();
    ......
评论人: 柠檬水 发布时间: 2007-11-13 21:23:00
这道看不懂啊,为什么会这样啊,我在运行时并不能得到这个结果啊,你能不能解释地再详细点,我挺笨的

发表评论

您的昵称: 昵称不填为“匿名”

您的Email: (可选)

评论内容:(字数请控制在500字以内)