【问题标题】:reverse a word using recursion使用递归反转单词
【发布时间】:2014-08-07 02:20:14
【问题描述】:

我正在尝试使用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 步,但我不确定如何继续。请帮忙。

【问题讨论】:

  • 您已经“完成”了第 2 步,而不是第 1 步。但重要的第一步是将反转的字符串存储在内存中,而不是打印出来。
  • @sharth 可以就地完成
  • @icepack:我同意。目前,输出到标准输出。如果原始发布者学会了如何将结果存储到程序可访问的任何块内存中,这可能会有所帮助。
  • @Adrian 它不是重复的。

标签: c recursion


【解决方案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']]

那么你需要做的就是向后打印新数组,你就得到了你想要的输出!

【讨论】:

    【解决方案2】:
    #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】:

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

      在伪代码中:

      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
      

      【讨论】:

        【解决方案4】:
        #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;
        }
        

        【讨论】:

          猜你喜欢
          • 2020-02-13
          • 2020-07-20
          • 1970-01-01
          • 2018-11-16
          • 2020-03-10
          • 1970-01-01
          • 2018-12-03
          • 1970-01-01
          • 2021-07-27
          相关资源
          最近更新 更多