MIT6.00.1X 計算機科學和PYTHON編程導論 第三週

第五講     遞歸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是不可變的
相關文章
相關標籤/搜索