递归反向字符串方法的参数过多错误

时间:2013-10-07 01:09:26

标签: c++ recursion

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

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

3 个答案:

答案 0 :(得分:5)

尝试前瞻声明:

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

将此放在void reverseDisplay (const string& s)之前。

答案 1 :(得分: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);
}

答案 2 :(得分: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;
    }
} 

我可能已经做了一些这些变量引用。