您的位置:首页 > 理论基础

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

2017-12-16 11:20 627 查看
迭代程序:

1 状态变量:

迭代次数i

目前的计算结果result

(状态变量都会有初始值)

2 状态变量的更新:

i=i−1,直到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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息