4

我正在尝试编写一个递归函数来打印字符串的反转,但是,编译器一直说它有太多参数。这个递归程序有什么问题?

#include <iostream>
using namespace std;

void reverseDisplay (const string& s)
{

    int length=s.size()-1;
    if (length==0)
        return;

    reverseDisplay(s, length);
}

void reverseDisplay (const string& s, int n)
{
    if(n==1)
        cout <<s[n];

    else { 
        cout << s[n];
        reverseDisplay(s, n-1);
    }
}

int main()
{
    string s="12345";
    reverseDisplay(s);


    return 0;
}
4

3 回答 3

5

尝试前向声明:

void reverseDisplay (const string& s, int n);

把这个放在前面void reverseDisplay (const string& s)

于 2013-10-07T01:13:08.810 回答
2

要递归地解决问题,您需要一个调用自身的函数和一个停止条件。但是,没有必要使用大小。此外,如果您有一个反转字符串的方法,它会更有用;留待以后打印。现在,在任何语言中反转字符串的典型方法是这段伪代码:

reverse("abcd")            -->
        string suffix
reverse("abcd", ""       ) -->  
reverse("bcd",  "a" + "" ) ==
reverse("bcd",  "a"      ) --> string, suffix
reverse("cd",   "b" + "a") ==
reverse("cd",   "ba"     ) -->
reverse("d",    "c" + "ba")==
reverse("d",    "cba"    ) -->
reverse("", "d" + cba")
reverse("", "dcba")       --> Let this be the stopping condition.

所以,我们这样做:

string reverse(const string original, string suffix);

string reverse(const string original) { 
    return reverse(original, new string);
} 

string reverse(const string original, string suffix) { 
    if (original.size()) {
         auto first = original.first();
         return reverse(original.substr(1), suffix.insert(0, 1, first));
    } else {
        return suffix;
    }
} 

我可能已经对其中一些变量进行了引用。

于 2013-10-07T02:19:06.887 回答
2

您实际上并没有在reverseDisplay(const string& s). 您正在调用other reverseDisplay(),它需要两个参数。这使它们重载,因此编译器将调用与参数匹配的那个(如果不存在此类重载,则显示错误)。

这是一个只有一个显示功能的有效递归解决方案:

#include <iostream>
#include <string>

void reverseDisplay(std::string const& s, std::size_t n)
{
    if (n == -1)
    {
        return;
    }

    std::cout << s[n];
    reverseDisplay(s, n-1);
}

int main()
{
    std::string s = "12345";
    std::size_t size = s.size();
    reverseDisplay(s, size-1);
}
于 2013-10-07T01:11:59.037 回答