计算机科学与Python编程导论_MIT 学习笔记(五)

迭代程序:
1 状态变量:
迭代次数 i
目前的计算结果 result
(状态变量都会有初始值)
2 状态变量的更新:
i=i1 ,直到 i=0 时停止
result=f(result)

例:用加法迭代计算乘法

def multi(x,p):
    ans=0
    while p>0:
        ans+=x
        p-=1
    return(ans)

递归

递归的两个步骤:

计算机科学与Python编程导论_MIT 学习笔记(五)_第1张图片

例:用递归思想做乘法

def multi(a,b):
    if b==1:
        return a
    else:
        return a+multi(a,b-1)

每次调用递归都会创建一个新的环境,包含新的局部变量
当最后一次递归实现后,会一步一步代回被调用的地方

递归的数学思想:数学归纳法
大脑中验证递归程序也应当用数学归纳法,而不要返回去用迭代来验证,只会陷入死循环

例:求阶乘

def step(n):
    if n==1:
        return n
    else:
        return n*step(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)

例:斐波那契数列

def fib(x):
    assert type(x)==int and x>=0
    if x==0 or x==1:
        return 1
    else:
        return fib(x-1)+fib(x-2)

assert函数检查输入是否符合假设,符合则执行函数体,否则结束并报错

例:回文判定

def isPalindrome(s):
    def toChare(s):
        s=s.lower()
        ans=''
        for c in s:
            if c in 'abcdefghijklmnopqrstuvwxyz':
                ans+=c
        return ans
    def isPal(s):
        if len(s)<=1:
            return True
        else:
            return s[0]==s[-1] and isPal(s[1:-1])
    return isPal(toChare(s))

例:对求斐波那契数列的递归程序求递归次数

def fibMetered(x):
    global numCalls
    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')

对于全局变量,应当小心使用,它会破坏程序的局部封装,从而更容易引入一些Bug。

你可能感兴趣的:(学习笔记,算法)