2012-04-24 3 views
3

Палиндром - это строка, которая читает то же самое вперед и назад. Примеры палиндромов включают «lol», «abba», «radar» и «pickle elkcip». Укажите, является ли или не работает она при любых обстоятельствах, описанных в следующей строке документации: «» «Возвращает True, если строка s палиндром и вернуть значение False в противном случае.» «»Почему бы не попробовать этот тест палиндрома?

def palindrome2(s): 
    n = len(s) 
    pal = True 
    for i in range(n/2): 
     if s[i] == s[n-i-1]: 
      pal = True 
     else: 
      pal = False 
    return pal 

Я не понимаю, почему эта функцию Wouldn Не работай. Мне кажется, что функция работает. По-видимому, логические значения используются неправильно, но я не понимаю, как булевы выше не используются должным образом. Может кто-нибудь, пожалуйста, объясните мне это?

+0

ли вы запускать программу с различными типами испытаний вход? Есть даже рамки, чтобы сделать это проще. – Marcin

ответ

6

То, как тело цикла кодируется значения pal может изменяться между True и False несколько раз в зависимости от того, были ли данная пара символов, чтобы соответствовать или не во время этой конкретной итерации.

Лучше проверить неравенство, установите свою логическую переменную pal на False и сразу же выйдете из цикла.

Что-то вроде этого:

def palindrome2(s): 
    n = len(s) 
    pal = True 

    for i in range(n/2) 
     if s[i] != s[n-i-1]: # the moment it's false 
      pal = False  # set pal and 
      break    # drop out of the loop 

    return pal 

в качестве альтернативы, без использования булевой переменной:

... 
    for i in range(n/2) 
     if s[i] != s[n-i-1]: # the moment it's false 
      return False  # exit the function by returning False 

    return True # otherwise return True 
+1

Или, вы знаете, поскольку это функция ... –

+0

@ IgnacioVazquez-Abrams Вы имеете в виду второе альтернативное решение - да, это чистый вариант, я согласен. Первый ближе всего к исходному коду, поэтому он есть. – Levon

+1

Примечание: если вы работаете под Python 3, вам понадобится n // 2 в диапазоне – rbanffy

3

Вы всегда проверяете каждый символ. Вам нужно вернуться, как только вы точно определите результат.

8

Для удовольствия, вы можете также попробовать гораздо проще:

def palindrome(s): 
    return s[::-1] == s 

(упражнение оставляя читателю информацию о том, как он работает)

+1

Вам не хватает 'return'. – Akavall

+0

@Akavall Хороший звонок :) (исправлено) – ulmangt

3

@ решение ulmangt является очень умным, но я бы с менее загадочным:

def palindrome(s): 
    return all((s[i] == s[-(i+1)] for i in range(len(s)/2))) 

По крайней мере, это не половина, как много сравнений ;-)

+0

Элегантный. +1 для оптимизации количества сравнений. (Тем не менее, в моих тестах это заняло 3,5 раза, если реализована реализация @ ulmangt.) – LarsH

+0

Вы также можете использовать 'not (any ((s [i]! = S [- (i + 1)] для i в диапазоне (len (s)/2)))) ', и вы избежите некоторых сравнений, когда кандидат не является палиндром. – rbanffy

+0

Интересно ... это не список, а набор понятий ... что это? И как избежать некоторых сравнений? – LarsH

Смежные вопросы