2013-10-07 81 views
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; 
} 
+0

另外,'reverseDisplay(const string&s,int n)'中的'if'語句應該是'if(n == 0)' – Roun

回答

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); 
} 
+0

無論如何,它應該在另一個之前。 – 2013-10-07 01:12:22

+0

爲什麼爲此使用遞歸?爲什麼不從長度使用簡單的循環 - 1 downto 0? – Cyclonecode

+0

@KristerAndersson:我沒有解決這個問題。在任何遞歸的情況下,OP的代碼都沒有那樣做。不過,帶有兩個參數的'reverseDisplay()'正確地做到了這一點。 – Jamal

5

嘗試向前聲明:

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

void reverseDisplay (const string& s)之前將這個。

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

我很可能已經取得了一些這些變量的引用。