Напишите рекурсивную функцию, которая переворачивает входную строку - PullRequest
9 голосов
/ 23 апреля 2011

Я читал книгу C ++ For Everyone и в одном из упражнений было сказано написать функцию string reverse(string str), где возвращаемое значение является обратным str.

Может кто-нибудь написать какой-нибудь базовый коди объяснить это мне?Я смотрю на этот вопрос со вчерашнего дня и не могу понять.Самое большее, что я получил, - это функция, возвращающая первую букву str (что я до сих пор не знаю, как это произошло)

Это так далеко, как я получил (Через час после публикации этого вопроса):

string reverse(string str)
{
    string word = "";

    if (str.length() <= 1)
    {
        return str;
    }
    else
    {
        string str_copy = str;
        int n = str_copy.length() - 1;
        string last_letter = str_copy.substr(n, 1);

        str_copy = str_copy.substr(0, n);
        word += reverse(str_copy);
        return str_copy;
    }
    return word;
}

Если я введу «Волк», он вернет Wol.Кто-нибудь, помогите мне здесь. Если я return word вместо return str_copy, тогда я получу w Если я return last_letter, тогда я получу l

Ответы [ 17 ]

0 голосов
/ 20 июля 2015

1-строчное рекурсивное решение:

string RecursiveReverse(string str, string prev = "") {
    return (str.length() == 0 ? prev : RecursiveReverse(str.substr(0, str.length()-1), prev += str[str.length()-1]));
}

Вы называете это так:

cout << RecursiveReverse("String to Reverse");
0 голосов
/ 17 июля 2015

Я знаю, что не должен давать решение, но, поскольку никто не упомянул об этом простом решении, я решил поделиться им.Я думаю, что код буквально является алгоритмом, поэтому нет необходимости в псевдокоде.

void c_plusplus_recursive_swap_reverse(std::string::iterator start, 
    std::string::iterator end) 
{
    if(start >= end) {
        return;
    }

    std::iter_swap(start, end);
    c_plusplus_recursive_swap_reverse(++start, --end);
}

Чтобы вызвать его, используйте:

c_plusplus_recursive_swap_reverse(temp.begin(), temp.end());
0 голосов
/ 26 мая 2014
void reverse(string &s, int &m) {
    if (m == s.size()-1)
        return;
    int going_to = s.size() - 1 - m;
    string leader = s.substr(1,going_to);
    string rest = s.substr(going_to+1,s.size());
    s = leader + s.substr(0,1) + rest;
    reverse(s,++m);    
}
int main ()
{
  string y = "oprah";
  int sz = 0;
  reverse(y,sz);
  cout << y << endl;
  return 0;
}
0 голосов
/ 02 марта 2014

Хороший ответ уже есть, но я хочу добавить свой подход с полностью работающей рекурсивной реверсивной строкой.

#include <iostream>
#include <string>
using namespace std;

char * reverse_s(char *, char*, int,int);

int main(int argc, char** argv) {
if(argc != 2) {
        cout << "\n ERROR! Input String";
        cout << "\n\t " << argv[0] << "STRING" << endl;
        return 1;
}       
        char* str = new char[strlen(argv[1])+1];
        strcpy(str,argv[1]);    
        char* rev_str = new char[strlen(str)+1];        
        cout<<"\n\nFinal Reverse of '" << str << "' is --> "<< reverse_s(str, rev_str, 0, strlen(str)) << endl;
        cin.ignore();
        delete rev_str, str;
        return 0;
}

char* reverse_s(char* str, char* rev_str, int str_index, int rev_index ) {
if(strlen(str) == 1)
        return str;

if(str[str_index] == '\0' ) {
        rev_str[str_index] = '\0';
        return rev_str;
}

str_index += 1;
rev_index -=1;

rev_str = reverse_s(str, rev_str, str_index, rev_index);
if(rev_index >= 0) {
        cout << "\n Now the str value is " << str[str_index-1] << " -- Index " << str_in
dex << " Rev Index: " << rev_index;
        rev_str[rev_index] = str[str_index-1];

        cout << "\nReversed Value: " << rev_str << endl;
}
return rev_str;
}
0 голосов
/ 05 января 2013

Вопрос в том, чтобы написать рекурсивную функцию.Вот один из подходов.Не аккуратный код, но делает то, что требуется.

/* string reversal through recursion */
#include <stdio.h>
#include <string.h>
#define size 1000
char rev(char []);
char new_line[size];
int j = 0;
int i =0;
int main ()
{
  char string[]="Game On";
  rev(string);
  printf("Reversed rev string is %s\n",new_line);
  return 0;
}
char rev(char line[])
{
 while(line[i]!='\0')
  { 
    i++;
    rev(line);
    i--;
    new_line[j] = line[i];
    j++;
    return line[i];
  }
  return line[i];
}
0 голосов
/ 22 июня 2019

рекурсивно обратится к исходной строке

void swap(string &str1, string &str2)
{
    string temp = str1;
    str1 = str2;
    str2 = str1;
}

void ReverseOriginalString(string &str, int p, int sizeOfStr)
{
    static int i = 0;
    if (p == sizeOfStr)
        return;

    ReverseOriginalString(str, s + 1, sizeOfStr);

    if (i <= p)
        swap(&str[i++], &str[p])
}

int main()
{
    string st = "Rizwan Haider";

    ReverseOriginalString(st, 0, st.length());
    std::cout << "Original String is Reversed: " << st << std::endl;

    return 0;
}
0 голосов
/ 03 августа 2014

вот мои 3 строковых реверса

std::string stringRevers(std::string s)
{
    if(s.length()<=1)return s;
    string word=s.at(s.length()-1)+stringRevers(s.substr(0,s.length()-1));//copy the last one at the beginning  and do the same with the rest
    return word;

}
...