原题链接: http://www.runoob.com/python/python-exercise-example31.html
题目: 请输入星期几的第一个字母来判断一下是星期几, 如果第一个字母一样, 则继续判断第二个字母.
我的代码:
- def fun():
- li=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
- s=input("please enter the initial:").upper()
- results=[]
- for i in li:
- if i.startswith(s): #startswith() 函数, 解决开头匹配
- results.append(i)
- if len(results) ==1:
- return results[0]
- else:
- s += input("please input the second char:").lower()
- for i in li:
- if i.startswith(s):
- return i
- if __name__ =='__main__':
- print(fun())
思考:
这道题乍一看很容易, 只要两次 if 判断就能实现. 但是看到别人的答案, 发现这是一种典型的题: 一次输入一个字母, 首字母匹配一个 list 里的内容, 如果匹配多个, 再输入并匹配第二个字母, 第三个字母......, 直到只匹配出一个的时候, 返回.
可能列表足够多, 要输入好几个字母才能判断, 那就不能用上述的两个 if 实现了, 应该设计一个重复判断的函数反复调用, 或者递归.
递归的实现:
- def fun(s,li=None):
- li == [] if li is None else li
- a =input("please enter a character :")
- s += a
- results=[]
- for i in li:
- if i.startswith(s):
- results.append(i)
- if len(results) ==1: #用 list 储存, 用 len() 判断匹配到的个数
- return results[0]
- else:
- return fun(s,li) #s 来存储上一次运算的结果, 给下一次, 用这种方式实现了递归
- if __name__=='__main__':
- s='' #初始化 s, 重要
- li=['abe','abce','abcdf','abcdef','abcda'] #其实这种方法并不全面, 要找的话, 找不到短的会重复匹配的项, 如 [a,abc,abcd],a 和 abc 都不可能被找出
- print(fun(s,li))
来源: http://www.bubuko.com/infodetail-2648953.html