使用递归反转一个单词

时间:2014-08-06 15:26:42

标签: c recursion

我试图在c中使用递归来反转一个单词,我得到了这个。

#include<stdio.h>

void reverse(char *a){
    if(*a){
        reverse(a+1);
        printf("%c",*a);
    }
}

int main() {
    char a[] = "i like this program very much";
    reverse(a); // i ekil siht margorp yrev 
    return 0;
}

假设输入字符串为i like this program very much。该函数应将字符串更改为much very program this like i

Algorithm:

1) Reverse the individual words, we get the below string.
     "i ekil siht margorp yrev hcum"
2) Reverse the whole string from start to end and you get the desired output.
     "much very program this like i"

我已成功完成第1步,我不知道如何继续进行。请帮忙。

4 个答案:

答案 0 :(得分:1)

为了帮助你而不放弃太多,我认为你的算法太复杂了。不要反转单个单词然后反转整个字符串,而是考虑将字符串拆分为以空格作为分隔符的字符串数组。然后简单地反转数组。

在C中这样做的方法有点奇怪;因为你已经将char数组用作字符串,所以你实际上需要创建一个char数组数组。例如:

char a[] = "i like this program very much";

实际上意味着

a = ['i', ' ', 'l', 'i', 'k', 'e', ' ', ... , 'c', 'h']

所以,你想创建一个char数组数组,所以它现在看起来像这样:

new_array = [['i'], ['l', 'i', 'k', 'e'], ... ['m', 'u', 'c', 'h']]

然后您需要做的就是向后打印新阵列,并且您已获得所需的输出!

答案 1 :(得分:0)

反向输出单词的程序与您已有的程序结构非常相似。但是,不要在每个单独的字符上进行递归调用,而是对每个单词进行递归调用。然后,在递归调用之后不打印字符,而是打印单词。当你到达字符串的末尾时递归停止,表明你找到了最后一个字。

在伪代码中:

reverse_words(string a)
    start_of_word = a;
    a = end_of_word(a);
    if (a is not at end of string)
        reverse_words(a)
    print start_of_word up to a

答案 2 :(得分:0)

#include <stdio.h>
#include <ctype.h>

void swap(char *a, char *b){
    char wk = *a;
    *a = *b;
    *b = wk;
}

void strpartrev(char *top, char *tail){
    while(top < tail)
        swap(top++, tail--);
}

void step1(char *a){
    while(isspace(*a))
        ++a;
    if(!*a)
        return;
    char *top =a;
    while(a[1] && !isspace(a[1]))
        ++a;
    char *tail = a;
    strpartrev(top, tail);
    step1(a+1);
}

int step2(char *str, int pos){
    char ch = str[pos];
    return (ch == '\0')? 0 : ((str[pos=step2(str, ++pos)]=ch), ++pos);
}

void reverse(char *a){
    step1(a);
    step2(a, 0);
}

int main() {
    char a[] = "i like this program very much";
    reverse(a);
    puts(a);//much very program this like i
    return 0;
}

答案 3 :(得分:0)

#include <stdio.h>
#include <string.h>

// copy substring of str from [start] to [first occurance of ' '] into buf
void substr(char *str, int start, char* buf){
    int end, strLength = strlen(str);
    end = start;
    do{
        if(str[end-1] == ' ' || end == strLength){
            strncpy(buf, str+(start*sizeof(char)), end-start);
            buf[end-start] = '\0';
            return;
        }
        end++;
    }while(1);
}

void reverse(char *a){
    if(strlen(a)==0){
        return;
    }
    if(*a){
        reverse(a+1);
        printf("%c",*a);
    }
}

void rec(char *str, int start){
    if(start >= strlen(str)){
        return;
    }

    char buf[32];
    substr(str, start, buf);
    rec(str, start + strlen(buf)+1);
    reverse(buf);
}

int main(int argc, char* argv[]) {
    char *str = "asd123 qwe kutu chu-chu";
    rec(str, 0);
    printf("\n");
    return 0;
}