第五講 遞歸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是不可變的