2016-03-31 1 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; 
} 

Je dois créer une fonction récursive qui transforme n'importe quelle chaîne en palindrome. C'est une question de devoirs et le seul code que je peux modifier est à l'intérieur de la fonction palindrome. Ce code fonctionne presque. Le problème est qu'il retourne "foobaraboo" et laisse la dernière lettre. Des conseils pour me diriger dans la bonne direction? J'ai joué avec le code pendant un certain temps et n'arrive pas à comprendre comment le changer pour que le dernier personnage du palindrome apparaisse.C++ Programme de récursion du créateur Palindrome

+0

Est-ce que vous jouez avec le débogueur dans votre IDE? Parcourez-le et voyez ce qui se passe à la fin du mot. – nicomp

+0

++ s change où s pointe, donc si vous le tracez, le second s [0] affichera un 'o' au lieu d'un 'f'. Vous voulez probablement s + 1 et non ++ s. – user222031

Répondre

1

Vous avez deux bogues dans votre logique. La première:

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

Cela devrait être:

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

si votre entrée entière est la chaîne « x », le résultat attendu est le palindrome « ​​xx », mais ce bug se traduira par une chaîne vide en cours d'impression.

Vous avez aussi un bug plus fondamental:

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

Votre intention ici est d'imprimer le caractère, imprimez récursive le reste de la chaîne de palindrome, puis ré-imprimer le même caractère. Mais à cause des ++ s, vous imprimez le mauvais caractère, la deuxième fois.

Cela devrait être:

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

EDIT: une question a été posée de savoir si vous voulez que le dernier caractère imprimé deux fois. Dans le cas contraire, cela devrait être:

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

Imprime deux fois le milieu 'r'. Ou est-ce ce que le PO a l'intention de faire? – stackptr

+0

Je ne veux pas imprimer deux fois le milieu. La sortie correcte serait "foobaraboof". –

+0

@stackptr - juste question, édité. –

0

Ici vous êtes

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

}  

La sortie du programme est

foobaraboof