我正在尝试编写一个递归函数来打印字符串的反转,但是,编译器一直说它有太多的参数。这个递归程序有什么问题?
#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;
}
答案 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;
}
}
我可能已经做了一些这些变量引用。