Python问题:一段关于Palindrome的代码

muench 发布于 2015年10月31日 | 更新于 2015年11月04日
无人欣赏。
def is_palindrome(s):
    if type(s) != str:
        return False
# base case before the or; recursive case after the or
    if len(s) <= 1 or s[0] == s[-1] and is_palindrome(s[1: -1]):
        return True
    return False

 strs = [False, 17, "", "a", "as", "ask", "ewe", "emma", "dromedary", "racecar"]

for s in strs:
print("%s --> %s" % (s, is_palindrome(s)))

请问 ispalindrome(s[1: -1]): 在 if len(s) <= 1 or s[0] == s[-1] and ispalindrome(s[1: -1]):当中起了什么作用?为什么是(s[1: -1])?

共8条回复
Achmed 回复于 2015年11月01日

就不能把python基础教程看完吗?

muench 回复于 2015年11月01日

1楼 @Achmed 您好,感谢您的回答。本人目前在一所高中上Computer Science的课程,可能是因为语言或者是个人学习能力的问题,所以很多问题可能理解错误或不到位或者无法理解。本人的Computer Science老师在本人学习Learn Python the hard way的中途给本人这个关于Palindrome的Task。

  1. 为何要实现palindrome的判断可以用s[0] == s[-1] and is_palindrome(s[1: -1]),本人从字面上理解前半部分,但无法理解后半部分重复这个方程的作用

  2. s在这里如果是一个string的性质,为什么s[a :b]? 这代表了什么? 是跟词典a对应b? 还是a到b?

  3. 如果在這里-1对应的是最后一个字符的话,为什么不是s[0:-1]而是s[1:-1]? is_palindrome(s[1:-1])究竟是在这个方程里干了些什么?

感谢您付出宝贵的时间给本人的建议也期待您的回答。

Achmed 回复于 2015年11月01日

你搜索python 字符串切片和list切片的资料。看看。就是两篇文章那么多的内容看完就行。

你先切片取到值后再代入到is_palindrome中判断就清晰了。

for s in strs 是每次把str里的一个元素传递给s,再切片取出字符。

董一凡 回复于 2015年11月02日
  1. 先问你一个问题,你理解递归了吗?
  2. 你试一下在 Python 控制台里敲一下下边的代码

    s = "012345"
    s1 = s[1:-1]
    print s1

看一下输出是什么

finalfish 回复于 2015年11月03日

典型的是递归啊...这题目算典型的了。反正递归思路是一定要把问题尽量切分缩小,尽量接近base case. base case看你题目是len(s) <= 1,return true。现在高中就叫python啦。。。正是高大上,我在澳洲学的IT...也是python入门,专门有一节讲递归思路。

muench 回复于 2015年11月04日

3楼 @Achmed 感谢您的答复,现在清晰了许多。

muench 回复于 2015年11月04日

4楼 @董一凡 谢谢您,已尝试在Python控制台中敲了您给的代码。当没看到5出来的时候本人很意外,根据楼上的建议去看了一些资料。虽然还是有些困惑,但相比以前已经清晰了许多。谢谢您的答复。

muench 回复于 2015年11月04日

5楼 @finalfish 您和楼上两位给出的关键词帮助本人指出了查找资料的方向,谢谢您:)

登录 或者 注册
相关帖子