我正在尝试编写一个代码来分析单词是否是回文。 顺便说一下,回文是一个向前和向后读的字。例如“女士”或“中午”
这是一个尝试:
x = raw_input("please enter a word:\n")
L = len(x)
# this part returns the first letter of the word
def first(word):
return word[0]
# this part returns the last letter of the word
def last(word):
return word[-1]
def middle(word):
return word[1:-1]
def is_palindrome(word):
if L <= 2:
print 'enter a word with at least three letters'
elif first(word) != last(word):
print 'This word is not a palindrome'
else:
word = middle(word)
is_palindrome(word)
is_palindrome(x)
但是当执行时,我得到了
IndexError: string index out of range
...line 7, in first return word[0]
“is_palindrome”的第一个分支完美无缺。即当这个词不是回文时,我没有错误。像“noopn”执行没有错误,但错误在第二个分支
我已经玩了很多次这段代码,但无法弄清楚“迭代部分”我有答案,但我还不想看它。我需要弄清楚两件事: 1.一种使函数is_palindrome中的迭代正常工作的方法吗? 2.最终退出程序的方法。
你们可以指导我如何在不提供解决方案的情况下回答这些问题吗?
最后我应该把print语句放在哪里:print'这个词是回文'
谢谢
答案 0 :(得分:4)
为了实现目标,为什么不使用:
string[::-1] == string
你回答的原因是当只有一个字母时,middle
将返回一个空字符串,然后''[0]
将导致错误。
答案 1 :(得分:3)
您的递归需要一个基本案例。一个字母的单词是回文,空字符串也是回文。
def is_palindrome(word):
# handle the base case
if len(word) <= 1:
print 'This word is a palindrome'
elif first(word) != last(word):
print 'This word is not a palindrome'
else:
word = middle(word)
is_palindrome(word)
如果你想拒绝少于三个字母的单词,那么你可以使用一个调用递归函数的辅助函数:
def is_palindromeHelper(word):
if len(word) <= 2:
print 'enter a word with at least three letters'
else:
is_palindrome(word)
答案 2 :(得分:2)
就个人而言,我更喜欢将支票和输出分开。所以is_palindrome()
应该只返回答案,而不是负责告诉用户。这使它更容易重复使用。
def is_palindrome(word):
# handle the base case
if len(word) <= 1:
return True
elif first(word) != last(word):
return False
else:
word = middle(word)
return is_palindrome(word)
这使您可以
x = raw_input("please enter a word:\n")
L = len(x)
if L <= 2:
print 'enter a word with at least three letters'
elif is_plaindrome(word):
print 'This word is a palindrome'
else:
print 'This word is not a palindrome'
这会将有效性检查放在执行的前面,而在递归中,您只有在递归时有效的检查。
(我怀疑你的检查是否有必要 - y
和oo
没有回文?我们可以争论空字符串,但是......)
接下来的改进步骤可能是省略函数first()
,last()
和middle()
- 它们很简单,只使用一次,因此您可以将代码放在使用它们的位置。
答案 3 :(得分:1)
在您的代码中添加了一个额外条件,这将解决您的问题。当你只剩下一个字符时,你不需要调用is_palindrome()
x = raw_input("please enter a word:\n")
L = len(x)
# this part returns the first letter of the word
def first(word):
return word[0]
# this part returns the last letter of the word
def last(word):
return word[-1]
def middle(word):
return word[1:-1]
def is_palindrome(word):
if L <= 2:
print 'enter a word with at least three letters'
elif first(word) != last(word):
print 'This word is not a palindrome'
else:
word = middle(word)
if len(word) > 1:
is_palindrome(word)
else:
print 'This word is a palindrome'
is_palindrome(x)
答案 4 :(得分:1)
不考虑大小写和空格的基本版本,我建议:
def is_palindrome(word):
if len(word) < 3:
print 'Enter a word with at least three letters'
else:
for letter in range(len(word)/2):
if word[letter] != word[-letter - 1]:
print "This word is not a palindrome"
return
print "This word is a palindrome"
虽然我认为它可能会个人删除空格并使用.lower()进行比较。然后它将不区分大小写,并允许测试短语或句子。
答案 5 :(得分:0)
伟大的方向家伙。所有人都得到了支持。
这些指示允许我制作以下简明代码
代码1
x = raw_input("enter a word to check if it is a palindrome:\n")
if x[::-1] == x:
print 'yes this one is a palindrome'
else:
print 'sorry try again by re-running the program'
代码2
x = raw_input("enter a word to check if it is a palindrome:\n")
if len(x) <= 1:
print 'Of course ', x, ' is a palindrome'
def is_palindrome(x):
if len(x) >= 2:
if x[0]!=x[-1]:
print 'This is not a palindrome'
else:
x = x[1:-1]
return is_palindrome(x)
print 'This is FINALLY a real palindrome'
is_palindrome(x)
我想我可以将函数is_palindrome包含为条件语句 len(x)&lt; = 1 的第二个分支,但我更喜欢这种方式,因为代码都是关于这个函数的