C语言---递归反向输出任意长度的字符串

(该字符串可以包含空格和回车!)
【题目要求】
编写一个递归函数,实现将输入的任意长度的字符串反向输出的功能。
例如输入字符串:ABCD,输出字符串:DCBA。

【题目分析】
应用递归的思想有时可以很轻松地解决一些看似不太容易实现的功能。
本题就是利用递归方法解决这类问题的一个代表。要将一个字符串反向地输出,一般采用的方法是将该字符串存放到一个数组中,然后将数组元素反向地输出即可。
这样需要一个存储空间,而且字符串的长度无法自由掌握,因为数组是一种静态数据结构。如果选用动态生成的顺序表或者链表来存放字符串,那么实现起来会比较麻烦,特别是如果把字符串存放到单向链表中,反向输出是非常困难的。
如何才能输入任意长度的字符串,然后将其反向输出呢?
可以通过一个递归的方法巧妙地实现这个功能。
算法描述如下:

print(){
    输入字符串的一个字符a:
    if(a!='#') print();
    if(a!='#') then 输出该字符a;
}

在该算法中,字符串的结束标志为#,并且#不作为字符串中的内容输出。首先输入字符串的一个字符,存放到变量a中:然后递归地调用函数print(),重复上述操作,知道输入字符串结束标志#为止;然后输出字符串中的字符。

假设从屏幕上输入字符串ABC,并且以#作为结束标志,函数print()的递归过程如下图所示:

如上图所示,从屏幕上输入字符串ABC,并以#作为结束标志,然后反向输出该字符串,整个流程沿着图中箭头方向执行。因此输出的字符串与输入的字符串方向相反。

整个实现的C源代码:

#include <stdio.h>
#include <stdlib.h>
print(){
    char a ;
    scanf("%c",&a);
    if(a!='#'){
        print();
    }
    if(a!='#'){
        printf("%c",a);
    }
}
int main()
{
    printf("Please input a string ending for '#' :\n");
    print();
    return 0;
}

输出结果:

下面的是没实现递归的Java实现这个功能的完整代码:
而且貌似java也不能从控制端读入单个字符。。。。
所以并不能实现这个c能实现的递归功能。

package cn.hncu;

import java.util.Scanner;

public class String1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String strs = "";
        while(true){
            int k=-1;
            String str = sc.nextLine();
            for(int i=0;i<str.length();i++){
                if(str.charAt(i)=='#'){
                    k=i;
                }
            }
            if(k==-1){
                strs = strs+str+"\r\n";
            }else{
                for(int i=0;i<k;i++){
                    strs = strs+str.charAt(i);
                }
            }
            if(k!=-1){
                break;
            }
        }

        for(int i=strs.length()-1;i>=0;i--){
            if(strs.charAt(i)=='\n'){
                System.out.println();
                i--;
                continue;
            }
            System.out.print(strs.charAt(i));
        }
    }
}
时间: 2024-08-11 03:32:00

C语言---递归反向输出任意长度的字符串的相关文章

产生任意长度的字符串+数字随机数

  可以自定义产生什么字符串以及多长    [PHP]代码 function random($length) { $hash = ''; $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'; $max = strlen($chars) - 1; mt_srand((double)microtime() * 1000000); for($i = 0; $i < $length; $i++) { $has

php产生任意长度的字符串+数字随机数的代码

可以自定义产生什么字符串以及多长    [PHP]代码 function random($length) { $hash = ''; $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'; $max = strlen($chars) - 1; mt_srand((double)microtime() * 1000000); for($i = 0; $i < $length; $i++) { $hash

c语言-这个递归为什么输出少一位?

问题描述 这个递归为什么输出少一位? #include <stdio.h> void prints(char *p){ if(*p != '') prints(++p); if(*p != '') printf("%c",*p); } int main(void){ char p[] = "hello"; prints(p); printf("n"); return 0; } 程序运行结果如下: F:test>gcc -g -o

《Python Cookbook(第3版)中文版》——1.2 从任意长度的可迭代对象中分解元素

1.2 从任意长度的可迭代对象中分解元素 1.2.1 问题 需要从某个可迭代对象中分解出N个元素,但是这个可迭代对象的长度可能超过N,这会导致出现"分解的值过多(too many values to unpack)"的异常. 1.2.2 解决方案 Python的"表达式"可以用来解决这个问题.例如,假设开设了一门课程,并决定在期末的作业成绩中去掉第一个和最后一个,只对中间剩下的成绩做平均分统计.如果只有4个成绩,也许可以简单地将4个都分解出来,但是如果有24个呢?表

c语言-C语言用递归函数输出1000以内的水仙花数,不得使用循环,请问怎么写。

问题描述 C语言用递归函数输出1000以内的水仙花数,不得使用循环,请问怎么写. C语言用递归函数输出1000以内的水仙花数,不得使用循环,请问怎么写. 解决方案 #include <stdio.h> void fun(int n) { if(n<100 || n>1000) return; int a,b,c; c=n%10; b=n/10%10; a=n/100%10; if(a*a*a+b*b*b+c*c*c == n) printf("%dn",n);

c语言-C语言编写一个输出的函数

问题描述 C语言编写一个输出的函数 编写一个函数,输出数组,要求通过参数指定每行输出的元素个数,以 及每个元素占有的列数. 假设自己定义一个参数为x 那么打印的时候printf(""%xd"")怎么用一个参数来满足每次打印时候 元素所占列数的不同呢 解决方案 #include <stdio.h>void display(int data[] int n int cols int w){ for (int i = 0; i < n; i++) { p

求C#DES加密的key可为任意长度字符或为空代码

问题描述 其它java,C代码的DES的KEY可任意长度字符或为空,现在我使用的C#des加密算法,当key为空时出错,请高手支招,贴出key可任意长度字符的代码网上的代码,key不可为空,必须要8位尹学渊用VC++写的,可key为空,加密结果到到其它工具或其它语言写的工具上去 反解,并且一切正常尹学渊用VC++写的(http://www.cnblogs.com/erwin/archive/2009/04/14/1435288.html#2346568),key为空得到的密文可到其它标准DES上

c语言-求教解释C语言递归调用过程

问题描述 求教解释C语言递归调用过程 #include "stdio.h" void fun(int k);// int main(void) { int n; scanf("%d",&n);// fun(n); return 0; } void fun(int k) { int n; n=k/10;// if(n!=0) fun(n); putchar(k%10+'0');// } 解决方案 解决方案二: http://blog.163.com/hhl10

C语言递归实现汉诺塔算法

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1) 直接将A柱子上的圆盘从A移动到C else 先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上 直接将A柱子上的第n个圆盘移动到C柱子上 最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 操作系统:ubuntu 编译软件:gcc 结果截