第五讲 递归python
递归:app
将计算简化为相同问题更简单的版本函数
递归须要基线条件,用于中止递归spa
例code
def recurMul(a, b): if b == 1: # 基线条件 return a else: return a + recurMul(a, b-1)
对于一个论点,要证实其对于全部数值n都是正确的,首先证实其对于最小的n是正确的,通常状况下n=0或n=1,而后假设其对于全部的n都是正确的,若是其对于n+1是正确的,则这个论点就是正确的对象
汉诺塔问题递归
经过分解可将汉诺塔问题分解为三个步骤:索引
1. 将上面n-1个圆盘移动到空闲位置上ci
2.将底端的圆盘移动到目标位置element
3.将n-1个圆盘移动到目标位置
def printMove(fr, to): print('move from ' + str(fr) + ' to ' + str(to)) def Towers(n, fr, to, spare): if n == 1: printMove(fr, to) else: Towers(n-1, fr, spare, to) Towers(1, fr, to, spare) Towers(n-1, spare, to, fr)
斐波那契数
1.第一个月和第二个月只有1只雌兔
2.第n月雌兔的和等于n-1个月和n-2个月雌兔之和
def fib(x): """assumes x an int >= 0 returns Fibonacci of x""" assert type(x) == int and x >= 0 if x == 0 or x == 1: return 1 else: return fib(x-1) + fib(x-2)
全局变量
使用global关键字声明全局变量,全局变量能够在其余函数中使用。用于共享数据。谨慎使用。
def fibMetered(x): global numCalls #用于记录 fibMetered被调用的次数 numCalls += 1 if x == 0 or x == 1: return 1 else: return fibMetered(x-1) + fibMetered(x-2) def testFib(n): for i in range(n+1): global numCalls numCalls = 0 print('fib of ' + str(i) + ' = ' + str(fibMetered(i))) print('fib called ' + str(numCalls) + ' times')
第六讲 对象
复合数据
复合数据中的元素能够是任何东西
元组(tuples)
#元组不能改变 #元组的定义 t1 = (1, ‘two’, 3) t2 = (t1, 'four') #元组的链接 print(t1 + t2) #元组的索引 print((t1 + t2)[3]) #元组切片 print((t1 + t2)[2:5]) #元组的单例 #元组的单例须要在元素后面加上 , t3 = ('five',)
## divisors ## 求公约数,用元组存储并返回 def findDivisors(n1, n2): """assumes that n1 and n2 are positive ints returns a tuple containing the common divisors of n1 and n2""" divisors = () # the empty tuple for i in range(1, min(n1, n2) + 1): if n1%i == 0 and n2%i == 0: divisors = divisors + (i,) return divisors divisors = findDivisors(20, 100) total = 0 for d in divisors: total += d print(total)
列表(list)
#列表能够进行和元组同样的操做 #列表能够改变 #列表使用中括号表示 ## universities Techs = ['MIT', 'Cal Tech'] Ivys = ['Harvard', 'Yale', 'Brown'] # 使用变量名组合列表,子列表仍是指向原来的列表 Univs = [Techs, Ivys] # 想要新建列表只能从新定义 Univs1 = [['MIT', 'Cal Tech'], ['Harvard', 'Yale', 'Brown']] #列表添加元素 Techs.append('RPI') print('Univs = ') print(Univs) print('') print('Univs1 =') print(Univs1) #列表用for进行迭代 for e in Univs: print('Univs contains ') print(e) print(' which contains') for u in e: print(' ' + u) #列表能够修改元素的值 Techs[2] = 'WPI’ # 当以参数传递列表给函数时,在函数中操做该列表,列表的长度不会更新 def removeDups(L1, L2): for e1 in L1: if e1 in L2: L1.remove(e1) L1 = [1,2,3,4] L2 = [1,2,5,6] removeDups(L1, L2) print(L1) [2, 3, 4] # 因此在函数中操做列表时,最好复制一份,这样函数中列表的长度才会更新 def removeDupsBetter(L1, L2): L1Start = L1[:] for e1 in L1Start: if e1 in L2: L1.remove(e1) L1 = [1,2,3,4] L2 = [1,2,5,6] removeDupsBetter(L1, L2) print(L1)
函数做为参数
# applyToEach # 函数做为参数能够在其余函数内调用该函数 def applyToEach(L, f): """assumes L is a list, f a function mutates L by replacing each element, e, of L by f(e)""" for i in range(len(L)): L[i] = f(L[i]) L = [1, -2, 3.4] def fact(n): if n == 1: return 1 else: return n*fact(n-1) def fib(n): if n == 0 or n == 1: return 1 else: return fib(n-1) + fib(n-2) applyToEach(L, abs) print(L) applyToEach(L, int) print(L) applyToEach(L, fact) print(L) applyToEach(L, fib) print(L) # python 提供了过程映射map,它最简单的形式是联合函数——即有一个参数的函数——和一个包含合适参数的集合 map(abs, [1, -2, 3, -4]) [1, 2, 3, 4] #基本上说,map通常会按次序映射到列表的每个元素,返回给咱们对列表应用的结果。 #因此它稍微有点像applyToEach,但它基本上在操进行相同的操做。然而,map更加通常化。 #咱们能够给它一个 n元函数 ——具备n个参数的函数 ——和参数的n个集合。map会依次将函数应用到这些参数对应的元素上。 L1 = [1, 28, 36] L2 = [2, 57, 9] map(min, L1, L2) [1, 28, 9]
字典
字典是以<key,value>的形式存在的,字典用大括号表示
#字典是无序的 monthNumbers = {‘Jan’:1, ‘Feb’:2, ‘Mar’:3, 1:’Jan’,2:’Feb’, 3:’Mar’} #字典取值采用key取值 monthNumbers[‘Jan’] 1 monthNumbers[1] ‘Jan’ #在字典中插入键值对 monthNumbers[‘Apr’] = 4 # 字典的迭代 collect = [] for e in monthNumbers: collect.append(e) collect [1, 2, 'Mar', 'Feb', 'Apr', 'Jan', 3] # 字典的迭代的结果就是字典的key的集合 monthNumbers.keys() [1, 2, 'Mar', 'Feb', 'Apr', 'Jan', 3] #字典中key是不可变的