Палиндромная программа Python без строковых функций

Я новичок в Python. Я написал палиндромные программы без использования строковых функций.

Вопрос 1: Почему 1-я логика не дает мне желаемого результата? Поправьте меня если я ошибаюсь.

Вопрос 2: во 2-й программе, если я пропущу i += 1 если в заявлении он должен дать мне правильный результат как for цикл автоматически увеличивает значение i, Скорее это дает мне правильный вывод, только если я включу это утверждение или нет. В чем может быть причина этого?

Логика 1:

n = input("eNTER  STRING\n")
length = int(len(n))
n = str(n)

for i in range(0, int(length/2+1)):
   if n[i] != n[-i - 1]:
      break

if i < int(length/2 + 1):
   print("not")
else:
   print("yes")

Логика 2:

n = input("ENTER  STRING\n")
length = int(len(n))

for i in range(0, int(length/2 + 1)):
   if n[i] == n[-i - 1]:
      i += 1
   else:
      break

if i < (length / 2):
   print("not")
else:
   print("yes")

Заранее спасибо..

9 ответов

Решение

В Logic 1 попробуйте if i<int(length/2): вместо if i<int((length/2+1)):

В Logic 2 даже удаление i+=1 дает правильный результат:

if n[i] == n[-i-1]:
    pass
else:
    break

Вы также можете использовать следующий код для того же:

def reverse(text):
    if len(text) <= 1:
        return text
    return reverse(text[1:]) + text[0]

n = input("ENTER  STRING\n")
if n==reverse(n):
    print ("It's a palindrome")
else:
    print ("It's not a palindrome")

Решение первой логики:

n = raw_input("eNTER  STRING\n")           
length = len(n)           
for i in range(0, (length/2)+1):
    if n[i] != n[-i - 1]:           
        break           

if i < int(length/2):  #Not length/2 + 1, as index starts at 0 and not 1. 
   print("not")
else:
   print("yes")

Во второй логике вам просто нужно посмотреть, есть ли какой-либо символ слева и справа, который НЕ одинаков. Таким образом, вы можете изменить свой код следующим образом:

n = raw_input("ENTER  STRING\n")
length = len(n)

for i in range(0, int(length/2 + 1)):
    if n[i] is not n[-i - 1]:      #change logic here.
        break

if i < (length / 2):
   print("not")
else:
   print("yes")
while True:
    x=input("Enter a string: ")
    if x==x[::-1]:
        print ("It's a palindrom")
    else:
        print ("It's not a palindrom")

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

И немного "безопасности" для программы:

while True:
    x=input("Enter a string: ")
    if x.isalpha():#checking input has only strings
        if x==x[::-1]:
            print ("It's a palindrom")
        else:
            print ("It's not a palindrom")
    else:
        print ("We allow only strings.")

Таким образом, будут обрабатываться только буквы алфавита. Нет цифр, символов и т. Д.

string=raw_input("Enter the String:")
l=len(string)
flag=0

for i in range(l/2):
    if string[i]!=string[l-i-1]:
        flag=1
        break

if flag==1:
    print "Not Palindrome"
else:
    print "Palindrome"

1) Логика в порядке - проблема в if заявление в конце. range(0, int(length/2 + 1)) содержит все числа из 0 в length/2 - вот почему проверка if i < int(length/2 + 1) всегда вернется True,

2) Это работает, даже если вы удалите i += 1,


Вы могли бы легко избежать этих маленьких ошибок, избавившись от второго if заявление:

n = input("eNTER  STRING\n")
length = len(n)

for i in range(0, length/2+1):
   if n[i] != n[-i - 1]:
      print("not")
      break
else:
   print("yes")

Это другой способ.

def PAL(S):
    return S== ''.join(reversed(S))

>>> PAL('ABABA')
True
>>> PAL('ABAA')
False

Выкл по одной ошибке в ваших сравнениях. В первой части логики вы говорите, что если первый индекс слова, где символ не равен его "зеркальному", меньше чем len(слово)/2 +1, то это не палиндром.

Итак, давайте возьмем абоба (индексы: 0,1,2,3,4)

Первый индекс, где символ не равен его зеркальному индексу, равен 2 (символ 'o') (мы начинаем с нуля): 2<(5/2) +1 или 2 <2 + 1 2 <3? Да, тогда ваша логика говорит, что это не палиндром, хотя это явно так.

Также довольно запутанно проверять правдивость утверждений, а затем выводить "нет"... это привычка, в которую не должны входить новые программисты, и я готов поспорить, что это часть того, почему у вас проблемы с поиском ошибки самостоятельно.

a=raw_input("eNTER  STRING\n")
b=a[::-1]
if b==a:
  print "True"
else:
  print "false" 

Однострочное решение этого вопроса:

      print(["String is a palindrome" if s == s[::-1] else "String is NOT a palindrome"])

Применение;

      s = input("Input something: ")
print(["String is a palindrome" if s == s[::-1] else "String is NOT a palindrome"])
Другие вопросы по тегам