2016-03-31 10 views
0
#include <iostream> 
using namespace std; 


void palindrome(char *s){ 
    if (s[1] == 0) 
    { 
     return; 
    } 
    cout << s[0]; 
    palindrome(++s); 
    cout << s[0]; 
} 


int main(){ 
    char s[30]="foobar"; 
    palindrome(s); 
    cout << endl; 
} 

cstringを回文に変換する再帰関数を作成する必要があります。これは宿題に関する質問であり、修正できる唯一のコードは回文関数の中にある。このコードはほとんど動作します。問題は「foobaraboo」を返し、最後の文字を残すことです。正しい方向で私を指すヒントはありますか?私はしばらくの間、コードを使って遊んできたので、それを変更する方法を考え出すことができないので、回文の最後の文字が表示されます。C++ Palindrome Creator再帰プログラム

+0

であるあなたは、あなたのIDEで、デバッガで遊んでいましたか?ステップを進めて、単語の最後に何が起こるかを見てください。 – nicomp

+0

++ sはsが指している場所を変更します。それをトレースすると、2番目のs [0]は 'f'の代わりに 'o'を表示します。あなたはおそらく、s + 1と++を必要としません。 – user222031

答えて

1

ロジックに2つのバグがあります。あなたの全体の入力は、文字列「x」は、あなたの予想結果は回文である「XX」であれば

if (*s == 0) 
{ 
    return; 
} 

が、このバグはになります:最初のものは:

if (s[1] == 0) 
{ 
    return; 
} 

これがなければなりません空の文字列が印刷されます。

また、より根本的なバグがあります。ここ

cout << s[0]; 
palindrome(++s); 
cout << s[0]; 

あなたの意図は、同じ文字を、現在の文字を印刷する再帰的に回文文字列の残りの部分を印刷し、その後、再印刷することです。

しかし、++ sのために、間違った文字が2度目に印刷されています。

これは次のようになります。

cout << s[0]; 
palindrome(s+1); 
cout << s[0]; 

EDIT:あなたは二回印刷し、最後の文字が欲しいかどうかの問題が提起されてきました。そうでない場合、これは次のようになります。

cout << s[0]; 
if (s[1]) 
{ 
    palindrome(s+1); 
    cout << s[0]; 
} 
+0

中央の 'r'を2回印刷します。それとも、OPが意図していることですか? – stackptr

+0

私は中間のrを2回印刷したくありません。正しい出力は「foobaraboof」です。 –

+0

@stackptr - 公平な質問、編集済み。 –

0

ここでは、

#include <iostream> 

void palindrome(const char *s) 
{ 
    if (s[0]) 
    {   
     std::cout << s[0]; 
     if (s[1]) 
     {    
      palindrome(s + 1); 
      std::cout << s[0]; 
     } 
    }   
} 

int main() 
{ 
    const char *s = "foobar"; 
    palindrome(s); 
    std::cout << std::endl; 

}  

あるプログラムの出力は

foobaraboof