本文共 2654 字,大约阅读时间需要 8 分钟。
3.递归
编写递归函数时,必须告诉它何时停止递归。正因为如此,每个递归函数都有两部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。def countdown(i): print(i) if i <= 0: #基线条件 return else: #递归条件 countdown(i - 1)print(countdown(6))
运行结果:
6 5 4 3 2 1 0小结:
def quicksort(my_list): if len(my_list) < 2: return my_list #基线条件:为空或只包含一个元素的列表是“有序”的 else: pivot = my_list[0] #递归条件 less = [i for i in my_list[1:] if i <= pivot] #由所有小于基准值的元素组成的子列表 greater = [i for i in my_list[1:] if i > pivot] #由所有大于基准值的元素组成的子列表 return quicksort(less) + [pivot] + quicksort(greater)print(quicksort([9,3,8,2,6]))
运行结果:
[2, 3, 6, 8, 9]4.4小结
voted = {}def check_voter(name): if voted.get(name): print('kick them out!') else: voted[name] = True print('let them vote!')
运行结果:
check_voter(‘Tom’) let them vote! check_voter(‘Jerry’) let them vote! check_voter(‘Jerry’) kick them out! 首先来投票的是Tom,上述代码打印let them vote!。接着Jerry来投票,打印的也是let them vote!。然后,Jerry又来投票,于是打印的就是kick them out!。 5.2.4小结 散列表适用于:#广度优先搜索#定义有向图graph = {}graph['you'] = ['alice','bob','claire']graph['bob'] = ['anuj','peggy']graph['alice'] = ['peggy']graph['claire'] = ['thom','jonny']graph['anuj'] = []graph['peggy'] = []graph['thom'] = []graph['jonny'] = []def person_is_seller(name): return name[-1] == 'm' #假定姓名以m结尾的就是芒果销售商from collections import dequedef search(name): search_queue = deque() #创建一个队列 search_queue += graph[name] #将你的邻居都加入到这个搜索队列中 searched = [] #这个列表用于记录检查过的人 while search_queue: #只要队列不为空 person = search_queue.popleft() #就取出其中的第一个人 if not person in searched: #仅当这个人没检查过时才检查 if person_is_seller(person): #检查这个人是否是芒果销售商 print(person+' is a mango seller!') #是芒果销售商 return True else: search_queue += graph[person] #不是芒果销售商,将这个人的朋友都加入搜索队列 searched.append(person) #将这个人标记为检查过 return False #如果到达了这里,就说明队列中没人是芒果销售商search('you')
运行结果:
thom is a mango seller! 广度优先搜索的运行时间为O(V+E),其中V为顶点,E为边数。转载地址:http://mncii.baihongyu.com/