对于使用递归函数的分配,我必须将字符串“ Cat正在运行”反转为“ running is Cat”。我能够反转整个字符串,但单词本身是反向的,显示为“ gninnur si taC”。我该如何解决?我只是递归函数做错了吗,还是我错过了他们的另一步?谢谢! (仅使用递归函数)
#include <iostream>
#include <string>
using namespace std;
string Reverse(string str,string strCopy, int end, int start)
{
if (str[start] != '\0')
{
strCopy[end]=str[start];
return Reverse(str, strCopy, end - 1, start + 1);
}
else { return strCopy; }
}
int main()
{
string str = "Cat is running";
string strCopy = str;
int start = 0;
int end = str.length()-1;
cout <<Reverse(str, strCopy, end, start) << endl;
}
答案 0 :(得分:0)
算法如下:
recursive_reverse_words(input):
if (input has one word or empty) return input
first_word, rest = split(input)
return recursive_reverse_words(rest) + " " + first_word
您需要编写split函数。
答案 1 :(得分:0)
首先,算法:
即使您被迫使用递归,反转字符串也非常简单:
template <class BidiIter>
void reverse(BidiIter first, BidiIter last) {
if (first == last || first == --last) return;
std::iter_swap(first, last);
reverse(++first, last);
}
仅反转 单词本身比较棘手:
template <class BidiIter>
void reverse_words_only(BidiIter first, BidiIter last) {
if (first == last) return;
const auto pred = [](unsigned char c){ return isspace(c); };
const auto begin = std::find_if_not(first, last, pred);
const auto end = std::find_if(begin, last, pred);
reverse(begin, end);
reverse_words_only(end, last);
}
接下来,使用它来逐字反转字符串:
template <class BidiIter>
void reverse_words(BidiIter first, BidiIter last) {
reverse(first, last);
reverse_words_only(first, last);
}
一切都很好,尾递归。不过,您可能必须编写std::find_if()
和std::find_if_not()
的递归版本。