<p>出现错误的原因是<code>is_palindrome()</code>连续调用<code>is_palindrome()</code>,如果单词<em>是回文,则不会停止。仅当单词<em>不是回文时,函数才会返回。由于没有停止点,最终正索引和负索引都将超过字符串的最大索引。我会尝试使用这个:</p>
<pre class="lang-py prettyprint-override"><code>def is_palindrome(phrase):
phrase = "".join(phrase.lower().split())
index, imax = 0, len(phrase)-1
while index < imax-index:
if phrase[index] != phrase[imax-index]:
return False
index += 1
return True
</code></pre>
<p>请注意,这只会检查直到<code>index</code>尽可能接近字符串的中间位置(这可以通过将<code>print(index)</code>放入<code>while</code>循环中来观察)。这样,代码就不会“双重检查”字符串的后半部分</p>
<p>以下是一些测试运行:</p>
<pre class="lang-py prettyprint-override"><code>>>> is_palindrome("racecar")
True
>>> is_palindrome("bus")
False
>>> is_palindrome("a man a plan a canal panama")
True
>>> is_palindrome("AABBAA")
True
</code></pre>
<p>但是,如果希望保留递归性质,可以尝试使用以下方法:</p>
<pre class="lang-py prettyprint-override"><code>def is_palindrome(phrase, positive=0, negative=-1):
phrase = ''.join(phrase.lower().split())
if positive >= len(phrase):
return True
if phrase[positive] == phrase[negative]:
return is_palindrome(phrase, positive+1, negative-1)
return False
</code></pre>
<p>一些测试运行:</p>
<pre class="lang-py prettyprint-override"><code>>>> is_palindrome("racecar")
True
>>> is_palindrome("bus")
False
>>> is_palindrome("A man a plan a canal panama")
True
>>> is_palindrome("AABBAA")
True
</code></pre>