我在python中写了一个简单的程序,检查句子是否是回文。但我无法弄清楚为什么它不起作用。结果总是错误的。有谁知道什么是错的?
def isPalindrome(word):
# Removes all spaces, and lowercase the word.
word = word.strip().lower()
word = word.replace(" ", "")
# If the length of the word is less than 1, means its a palindrome
if (len(word) <= 1):
return True
# Compares the first and the last character of the word.
# If it is the same, calls the function again with the same word,
# without its first and last characters. If its not the same, its
# not palindrome
else:
if word[0] == word[-1]:
isPalindrome(word[1:-1])
else:
return False
sentence = input("Enter a sentence: \n")
if (isPalindrome(sentence)):
print("The sentence %s is palindrome." % sentence)
else:
print("The sentence %s is NOT palindrome" % sentence)
答案 0 :(得分:5)
您没有返回该功能的结果。
替换:
if word[0] == word[-1]:
isPalindrome(word[1:-1])
与
if word[0] == word[-1]:
return isPalindrome(word[1:-1])
答案 1 :(得分:3)
你这样做比以前更复杂:
def palindrome(sentence):
sentence = sentence.strip().lower().replace(" ", "")
return sentence == sentence[::-1]
sentence[::-1]
使用string slicing来反转字符串中的字符。
一个稍微详细的解决方案,显示上述return
语句的逻辑如何工作:
def palindrome(sentence):
sentence = sentence.strip().lower().replace(" ", "")
if sentence == sentence[::-1]:
return True
else:
return False
答案 2 :(得分:2)
你的算法很好,唯一的问题是你没有通过递归返回真实的结果,你必须在递归调用它时返回isPalindrome结果:
else:
if word[0] == word[-1]:
return isPalindrome(word[1:-1]) #this changed
else:
return False
答案 3 :(得分:1)
在Python中检查单词的最佳方法如下:
var[::] == var[::-1]
但是,了解Python在您var[::-1]
时会创建新的字符串副本非常重要,因为Python内部不知道反向操作是否会导致相同的字符串。因此,对它的编码方式是创建它的新副本。因此,当您尝试var[::1] is var[::-1]
时,您会得到FALSE
。
例如:
var = "RADAR"
var1 = var[::]
var is var1
True
var2 = var[0:6:1]
var is var2
True
var3 = var[::-1]
var is var3
False
var4 = var[-1:-6:-1]
var is var4
False
var1
'RADAR'
var2
'RADAR'
var3
'RADAR'
var4
'RADAR'
在这里您可以看到前进时它没有创建“ RADAR”的副本,它使用了相同的引用。由于PY内部了解此操作,因此将导致相同的字符串对象。 但是,当您向后移动时,结果可能会有所不同。例如,如果我对“ Ethans”执行相同的操作,则相反的操作将不相同。因此,PY不知道反向字符串的结果是什么,它会创建它的新副本。
因此,反向字符串使用'is'运算符返回假值。
这里需要注意的另一点有趣。参见以下示例:
var = "abc"
var1 = "abc"
var is var1
True
var = "Ethans Baner Pune"
var1 = "Ethans Baner Pune"
var is var1
False
我们知道字符串是不可变的,并且遵循Singleton DP,那么为什么第二种情况返回FALSE?
这是因为PY不想在速度和性能上妥协。如果您写的字符串很长并且已经存在于内存中,则PY应该引用相同的字符串。但是,发现长字符串将花费很长时间,并且性能会降低。因此,PY不用引用现有的字符串,而是创建一个新的字符串。对于整数,我们也已经了解了这一点,在整数中,它仅遵循Singleton DP方法直到达到极限值(256)。
让我们再看一个示例:
var = "abcdefgh"
var1 = "abcdefgh"
var is var1
True
var = "abcd efgh"
var1 = "abcd efgh"
var is var1
False
答案 4 :(得分:0)
您需要更换&#34;输入&#34;使用&#34; raw_input&#34;。 此外,你递归调用isPalindrome,这里也有一个错误。它应该是:
if word[0] == word[-1]:
return isPalindrome(word[1:-1])
else:
return False
检查下面的更正代码:
def isPalindrome(word):
# Removes all spaces, and lowercase the word.
word = word.strip().lower()
word = word.replace(" ", "")
# If the length of the word is less than 1, means its a palindrome
if (len(word) <= 1):
return True
# Compares the first and the last character of the word.
# If it is the same, calls the function again with the same word, without its first and last characters.
# If its not the same, its not palindrome
if word[0] == word[-1]:
return isPalindrome(word[1:-1])
else:
return False
sentence = raw_input("Enter a sentence: \n")
if (isPalindrome(sentence)):
print("The sentence %s is palindrome." % sentence)
else:
print("The sentence %s is NOT palindrome" % sentence)
答案 5 :(得分:0)
我认为这是一个赋值,并且递归是必要的,显然return word == word[::-1]
更简单但并不真正相关。您可以更简洁地编写递归函数:
def isPalindrome(word):
if not word:
return True
return word[0] == word[-1] and isPalindrome(word[1:-1])
word[0] == word[-1]
将为True
或False
,因此您将获得一个空字符串not word
将True
,以便递归结束并且函数返回True
或word[0] == word[-1]
将为False
,因此该函数将返回False
,因为and isPalindrome(word[1:-1])
永远不会被评估。
我也可以在功能之外进行降低:
def isPalindrome(word):
if not word:
return True
return word[0] == word[-1] and isPalindrome(word[1:-1])
sentence = input("Enter a sentence: \n")
sentence = sentence.strip().lower()
sentence = sentence.replace(" ", "")
if isPalindrome(sentence):
print("The sentence %s is palindrome." % sentence)
else:
print("The sentence %s is NOT palindrome" % sentence)
答案 6 :(得分:0)
由于已经解释了错误并且已经采用了明显的s == s[::-1]
,我只是将原始版本的可能最小版本投入到混合中:
def isPalindrome(s):
s = s.strip().lower()
return not s or s[0] == s[-1] and isPalindrome(s[1:-1])
请注意,您不需要replace(" ", "")
。现在用strip()
移除外部空间,内部的空格将在strip()
之后被移除,在更深入到递归的调用中(如果我们不提前停止,因为s[0] == s[-1]
失败了。)