2016-04-10 17 views
0

Düzenleme: Not: Alfabenin bir parçası OLMAYAN karakterler görmezden gelmemem gerekiyordu.Python: Girdiğim metnin palidrom olup olmadığını kontrol eden özyinelemeli bir işlev oluşturmaya çalışıyorum

def is_palindrome(text): 
    ''' 
    A Recursive Function that returns True if the parameter, text, is a palindrome, False if not. 
    Ignores capitalization, punctuation, and spaces. 

    text: a String 
    returns True or False 
    ''' 
    text = list(text) 
    if len(text) == 0: 
     return True 
    else: 
     if text[0] == ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]: 
      if text[-1] == ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]: 
       if text[0].lower() == text[-1].lower(): 
        text.remove(text[0]) 
        text.remove(text[-1]) 
        return is_palindrome(text) 
       else: 
        return False 
      else: 
       text.remove(text[-1]) 
       return is_palindrome(text) 
     else: 
      text.remove(text[0]) 
      return is_palindrome(text) 

ben "eğer" ifadesi önce baskı (metin) yaparak "metin" değişkeninin bir baskı beyanı girerek ayıklama çalıştı. Ben, is_palindrome ("aabbcc")

aabbcc 
['a', 'b', 'b', 'c', 'c'] 
['b', 'b', 'c', 'c'] 
['b', 'c', 'c'] 
['c', 'c'] 
['c'] 
[] 

Yani sadece karşı "metni atlayarak listeden her zaman ilk öğe çıkarmadan gibi görünüyor test vakası çalışırsanız

Bunlar

alıyorum sonuçlarıdır .remove (text [0]) "en sondaki ifadede.

Bunu nasıl düzeltebilirim? Düşünceler?

+0

bütün bir diziye tek dizi öğesi karşılaştırıyorsunuz ? Karşılaştırırken bir kontrol eşdeğerini kullanmayı deneyin. – Brody

+0

Evet, sorun, tek bir öğeyi dizinin tamamını karşılaştırmaktır. Teşekkürler! –

cevap

0

Sen dizeleri bir liste ile eşitlik için kontrol ediyoruz: singe karakter hattında karakterlerin listesi eşdeğer olup olmadığını kontrol ediyoruz

: Bu geçen değil

if text[0] == ['A', ....] 

koşulu ve ardından ilk öğeyi kaldırarak diğer ifadenize gidersiniz. Bunu tekrarlamak zorunda kalmamak size listesine bir değişken dize içe ve sadece kod bazı basitleştirmek için string.ascii içinde text[0] olmadığını kontrol veya yapabiliriz rağmen

Sen

if text[0] in ['A', '''] 

kontrol edilmelidir iki defa. hemen başarısız oluyor -

Hatta daha basit

, Sen gerçekten karakterlerin bir bütün listesine bir karakter karşılaştırdığınız if text[0].isalpha()

+0

Tamam. Bu test durumu için, is_palindrome ("enginar") çalışmaları ----> Yanlış Ama is_palindrome çalıştığınızda Bana bir IndexError verir ("şer değil Canlı"): dışarı listesi dizini –

+1

aralığını kullanın veya 'metin [0] .isalpha()' – zondo

+0

kullanın. İyi nokta, 'isalpha' burada daha kolay gitmenin yoludur. Tamamen bunu kaçırdı. – Pythonista

1

kullanın. Kendi kod yazmak gerekir

: Ayrıca

def is_ascii(c): 
    # yes, python allows you to write it like this: 
    return ('a' <= c <='z') or ('A' <= c <='Z') 

, bir stringlist dönüştürülmesi gerekmez:

def is_palindrome(text): 
    # your condition for palindrome was also wrong: 
    # "foof" would end up with len(text)==0 
    # "pap" is also palindrome and ends up with len(text)==1 
    if len(text)<2: 
    return True 

    # you don't have to modify the text before passing it to the next iteration 
    # (uses Python `slicing`) 
    if not is_ascii(text[0]): 
    return is_palindrome(text[1:]) 
    if not is_ascii(text[-1]): 
    return is_palindrome(text[:-1]) 
    # both end characters are ascii 
    if text[0].lower()==text[1].lower(): 
    # recurse with remaining characters 
    return is_palindrome(text[1:-1]) 
    # not a palindrome 
    return False 
İlgili konular