2017-10-18 5 views
1

Un cours en ligne de MIT que j'ai téléchargé demande à ses étudiants de créer une fonction pour tester si une chaîne est un palindrome. Ils mentionnent len et ne prennent qu'une tranche de la ficelle. Comme je comprends la mission que je n'ai utilisé ni, mais mon code semble fonctionner. Y a-t-il quelque chose qui me manque?Travail à domicile - Étude personnelle à domicile - Palindrome

def test_word(): 
    question = input("Do you want to see if a word or sentence is a 
palindrome? (y/n)") 
    question = question.lower() 
    if question == "y": 
     sample = input("Provide test word or sentence: \n>>>") 
     sample = sample.lower() 
     print(is_palindrome(sample)) 
     test_word() 
    elif question == "n": 
     print("Goodbye!") 
     quit() 
    else: 
     print("Y for yes or N for no, please.") 
     test_word() 


def is_palindrome(x): 
    # Use negative 1 step to reverse order 
    y = x[::-1] 

    if x == y: 
     return True 
    elif x != y: 
     return False 



test_word() 
+0

Si votre code fonctionne quel est le problème? – Rahul

Répondre

0

Votre fonction is_palindrome(x) fonctionne bien, mais vous pouvez le raccourcir.

def is_palindrome(x): 
    return x == x[::-1] 

Vous pouvez également utiliser une solution de rechange au lieu unintuitive [:: - 1] syntaxe (Source). Mais, cela peut être plus lent, surtout lorsque les chaînes rallongent (Vérifiez le commentaire de mata):

def is_palindrome(x): 
    return x == ''.join(reversed(x)) 

Et, votre méthode test_word() encore et encore elle-même appelle (récursive). La récursivité n'est pas nécessaire et, en fait, un peu problématique ici. Vous devriez utiliser la boucle:

def test_word(): 
    while True: 
     question = input("Do you want to see if a word or sentence is a palindrome? (y/n)") 
     question = question.lower() 
     if question == "y": 
      sample = input("Provide test word or sentence: \n>>>") 
      sample = sample.lower() 
      print(is_palindrome(sample)) 
     elif question == "n": 
      print("Goodbye!") 
      break 
     else: 
      print("Y for yes or N for no, please.") 

J'espère, cela aide.

+0

Merci! Comme je suis moi-même étudiant, il est bon d'obtenir des conseils comme celui-ci. – Ruark

+1

Unintuitive est une question de tase, je ne trouve pas ''' .join (inversé (x))' mieux que 'x [:: - 1]', rejoignant l'objet inversé d'une chaîne sur la chaîne vide isn ' T vraiment intuitive. En outre, il peut être [bien plus lent] (https://pastebin.com/jrkdHrDX), spécialement lorsque les chaînes sont plus longues. La force de 'reversed()' est qu'il n'a pas à créer toute la séquence inversée en mémoire. – mata

+0

@mata Je n'ai pas assez de connaissances à ce sujet, je viens de partager ce que [le lien source] (https://stackoverflow.com/a/17331369/6900838) dit. Mais, grâce à vous, maintenant nous savons que 'x [:: - 1]' est plus rapide. – Alperen