Палиндромная программа 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"])