计算机科学与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)

递归

递归的两个步骤:

递归步骤

例:用递归思想做乘法

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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值