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是不可变的
相关文章
相关标签/搜索