2017-01-18 1 views
-2

Je veux trouver Palindrome d'un mot. Quel est le problème ici?Trouver Palindrome

fonction principale:

int size; 
    string input; 
    cin>>input; 
    size = input.length(); 
    if(testPalindrome(input,size-1,0)) 
    cout<<"It's Palindrome"; 
    else 
    cout<<"It's not Palindrome"; 

Et la fonction testPalindrome est:

bool testPalindrome (string pal , int last, int first){ 

    if (pal[first] != pal[last]) 
     return false; 
    else{ 
     if (first<last) 
      testPalindrome(pal,last-1,first+1); 
     else 
      return true; 
    } 
} 

J'ai lu this link et trouvé la réponse pour déterminer Palindromes, mais pourquoi celui-ci ne fonctionne pas?

+4

Il semble que vous ayez besoin d'apprendre à utiliser un débogueur par votre code. Avec un bon débogueur, vous pouvez exécuter votre programme ligne par ligne et voir où il dévie de ce que vous attendez. C'est un outil essentiel si vous voulez faire de la programmation. Pour en savoir plus: ** [Comment déboguer de petits programmes] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+1

Il y a des chemins dans votre 'testPalindrome' qui ne retourne rien. Cela conduit à * comportement indéfini *. Un bon compilateur aurait dû vous lancer des avertissements. –

+2

S'il vous plaît être plus précis que "ne fonctionne pas". Il existe d'innombrables façons qu'un programme peut "ne pas fonctionner". – molbdnilo

Répondre

2

Je pense que vous avez oublié la déclaration de retour dans la fonction

if (first<last) 
     return testPalindrome(pal,last-1,first+1); 
     ^^^^^^^ 

Habituellement, le premier paramètre d'une gamme précise la valeur inférieure et le second paramètre spécifie soit la valeur supérieure de la plage qui ne sont pas inclus dans le

Et le premier paramètre doit être déclaré comme ayant un type de référence constante car la chaîne elle-même n'est pas modifiée et vous allez échapper à l'allocation de mémoire supplémentaire.

La fonction récursive peut être écrit comme

#include <iostream> 
#include <string> 

bool testPalindrome(const std::string &s, 
    std::string::size_type i, 
    std::string::size_type n) 
{ 
    return n < 2 || (s[i] == s[n-1] && testPalindrome(s, i + 1, n - 2)); 
} 

int main() 
{ 
    std::cout << testPalindrome("abba", 0, 4) << std::endl; 
    std::cout << testPalindrome("aba", 0, 3) << std::endl; 
    std::cout << testPalindrome("aa", 0, 2) << std::endl; 
    std::cout << testPalindrome("a", 0, 1) << std::endl; 
    std::cout << testPalindrome("ab", 0, 2) << std::endl; 

    return 0; 
} 

La sortie du programme est

1 
1 
1 
1 
0 

La façon de vérifier plus simple si un objet du type std::string est un palindrome est d'écrire l'expression

s == std::string(s.rbegin(), s.rend()) 
6

Vous devez renvoyer le résultat de l'appel récursif, comme lorsque vous appelez une autre fonction.

Si ce n'est pas le cas, le comportement n'est pas défini.