第1天-用C语言递归倒序输出字符串

16629960:

题目描述:

在键盘上输入连续的字符串,直到按回车时结束,屏幕上会显示出与输入倒序的字符串。例如输入:Iam man! 则会得到输出为 :!nam maI 。

题目分析:

题目中要用到递归的思想,所以考虑建立一个子函数负责递归,然后倒序输出之前输入的字符串。

代码如下:

#include <stdio.h>

void reverse_output () ;
int main ()
{
    printf ( "请输入字符串,以回车结束 :\n" );

    reverse_output ();

    printf ( "\n以上是反序的输出 " );

    return 0;
}

void reverse_output ( )
{
    char ch_input;
    ch_input=getchar(  );

    if ( ch_input != '\n' )
        reverse_output () ;
    else
        return ;

    printf ( "%c" , ch_input );
}

输出示例:

子函数的理解:

简要概括:先输入的字符因为要进入下一层递归不会执行printf()函数,只有等到递归回到这一层才会执行printf()函数,从而打印出之前存储的字符。

首先定义变量ch_input用来存储getchar()函数获得的字符变量

然后通过 if 判断该变量是否是“回车(\n)”,如果不是那么进入下一层递归继续输入下一个字符;如果是就通过return语句表明遇到了回车符,递归将退出本层回到上一层;

只有在if判断时失败,if语句结束才会执行下面的printf()函数,此时执行处于递归的最里层,先执行最里层的printf()函数,再推出到上一层再次执行printf()函数,从而实现逆序输出。

通过这样返回上一层就执行printf()函数的方式,就实现了逆序的输出。

规律:

如果printf()函数放在了递归调用的前面,则正序输出

如果printf()函数放在了递归调用的后面,则逆序输出

递归的理解:

递归其实就是属于函数自己调用自己,从而重复实现自身功能的一个步骤。

自己调用自身,其实也是一个函数在调用另一个函数的过程,只是这里的另一个函数,原来竟是我自己。

在递归当中,其实也可以看作是一层一层深入进去。

 左边的大方块看作是一个函数,函数名叫A。顺序执行指令之后到了中间的小方块又是调用函数A,于是在下一层中从头开始执行函数A的代码,下一层中没有调用函数A本身了,而是执行了B鱼块,执行完成之后会继续执行当层的剩余代码,完成后返回第一层刚调用A的位置,再接着执行。

基于上述思路,可以发现这不就是普通的函数调用思路吗。

函数调用:A调用B,B调用C,C调用D,D返回到C,C返回到B,B返回到A。

因此如果用函数调用的思路来写递归程序

注意:用函数写存在的局限性就在于,每一层都要单独写一个函数,因此我只写三个,表示只执行三层递归

代码示例:

#include <stdio.h>
void A();
void B();
void C();

//主函数中去调用A函数
int main ()
{

    printf ( "请输入字符串,以回车结束 :\n" );
    A();

    return 0;
}

void A ()
{
    int ch=getchar();
    B();                    //调用下一层函数
    printf ( "%c" , ch );
    return ;
}

void B ()
{
    int ch=getchar();
    C();                    //调用下一层函数
    printf ( "%c" , ch );
    return ;
}

void C()
{
    int ch=getchar();
    printf ( "%c" , ch );        //没有继续调用,所以开始返回上一层
    return ;
}

输出示例:

另外因为只有三个子函数,如果输入字符数量超过3则会出现输出丢失

输出示例 

补充:

利用递归的思路,可以实现数据结构中队列的先入先出FIFO,和栈的先入后出FILO。

文章参考:

C语言每日一练——第18天:利用递归函数调用方式,将所输入的字符以相反顺序打印出来_小辉_Super的博客-CSDN博客icon-default.png?t=M3K6https://blog.csdn.net/weixin_43772810/article/details/120464271

理解递归的本质:递归与栈_bobbypapa的博客-CSDN博客_递归栈icon-default.png?t=M3K6https://blog.csdn.net/bobbypollo/article/details/79891556

猜你喜欢

转载自blog.csdn.net/qq_43323677/article/details/124346649