0

我正在做一些递归练习。前一个是为字符串创建一个 reverse() 函数,该函数基本上删除第一个字符,然后组合解决方案。我设法做到了,这里是源代码(整个源代码) 当前的任务是通过添加一个反转字符串子字符串的辅助函数来修改这个函数(本书中的以下练习)。此刻我陷入了困境。我的理解是,当您需要传递额外的参数或其他东西时使用辅助函数,而这个函数不需要任何东西,所以我真的不知道如何解决这个问题。帮助表示赞赏。

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

    void reverse(string& text)
    {
        if (text.length() == 0)
        {
            return;
        }
        if (text.length() == 1)
        {
            return;
        }
        else
        {
            string firstLetter = text.substr(0,1);
            text = text.substr(1, text.length()-1);
            reverse(text);
            text += firstLetter;
            }
    }
    int main()
    {
        string a = "tyu";
        reverse(a);
        cout << a << endl;
        return 0;
    }

一个人建议使用参数等,这是我的尝试:

#include <iostream>
#include <string>
using namespace std;
//is actually doing the hard work
void reverse1(string& input, int a, int b)
{
        // base case
        if( a >= b)
        {
             return;
        }
        //swap the characters
        char tmp;
        tmp = input[a];
        input[a] = input[b];
        input[b] = tmp;
        //create the boundries for the new substring
        a++;
        b--;
        //call the function again
        reverse1(input, a, b);
}

// sets the parameters and calls the helper function
void strreverse(string& input)
{

    reverse1(input, 0, input.length()-1);
}

int main()
{
    cout << "Please enter the string which you want to be reversed:";
    string a;
    cin >> a;
    strreverse(a);
    cout << a << endl;
    return 0;
}
4

3 回答 3

2

目标可能是避免创建所有中间子字符串。辅助函数将采用迭代器,或者除了字符串开始反转之外的开始和结束索引。

于 2013-05-16T15:31:46.017 回答
1

尝试实现反转,以便只有一个实例std::string(即像使用数组一样使用它)。然后,您将需要一个带有附加参数的辅助函数(至少一个参数 - 现在要反转哪个索引)。

我将在此处实现反向作为一系列交换:a[0] <-> a[n-1]、a[1] <-> a[n-2] 等,其中 n 是字符串的长度。

于 2013-05-16T15:31:53.990 回答
0

您可以定义一个辅助函数,该函数采用它将反转的子字符串的开始和结束索引。该函数应将起始索引处的元素与结束索引处的元素交换 IFF 起始索引和结束索引之间的差异为 1。否则,它会通过递减结束索引并递增起始索引来对自身进行递归调用。如果开始和结束索引变得相同,您将需要继续检查条件。

于 2013-05-16T15:49:49.457 回答