递归反转字符串方法存在过多参数错误

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;
}

而且,reverseDisplay(const string& s, int n)中的if语句应为if(n==0) - Roun
3个回答

5
尝试使用前置声明:

尝试使用前置声明:

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

void reverseDisplay (const string& s)之前加入此代码。


2
你在 reverseDisplay(const string& s) 函数中并没有真正地进行递归,而是调用了另一个带有两个参数的 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);
}

无论哪个应该先执行。 - user1508519
为什么要使用递归呢?为什么不使用一个简单的for循环,从length - 1到0? - Cyclonecode
@KristerAndersson:我没有在谈论那个。无论如何,在递归的任何情况下,OP的代码都没有这样做。然而,带有两个参数的reverseDisplay()正在正确地执行此操作。 - Jamal

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;
    }
} 

我可能可以将其中一些变量设置为引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接