计算机科学与Python编程导论_MIT 学习笔记(五)
2017-12-16 11:20
627 查看
迭代程序:
1 状态变量:
迭代次数i
目前的计算结果result
(状态变量都会有初始值)
2 状态变量的更新:
i=i−1,直到i=0时停止
result=f(result)
例:用加法迭代计算乘法
![](https://img-blog.csdn.net/20171215161545750?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2h1Y2tzb253aGVlbA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
例:用递归思想做乘法
每次调用递归都会创建一个新的环境,包含新的局部变量
当最后一次递归实现后,会一步一步代回被调用的地方
递归的数学思想:数学归纳法
大脑中验证递归程序也应当用数学归纳法,而不要返回去用迭代来验证,只会陷入死循环
例:求阶乘
例:汉诺塔问题
例:斐波那契数列
assert函数检查输入是否符合假设,符合则执行函数体,否则结束并报错
例:回文判定
例:对求斐波那契数列的递归程序求递归次数
对于全局变量,应当小心使用,它会破坏程序的局部封装,从而更容易引入一些Bug。
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。
相关文章推荐
- 计算机科学与Python编程导论_MIT 学习笔记(六)
- 计算机科学与Python编程导论_MIT 学习笔记(一)
- 计算机科学与Python编程导论_MIT 学习笔记(三)
- 计算机科学与Python编程导论_MIT 学习笔记(四)
- 计算机科学与Python编程导论_MIT 学习笔记(七)
- 计算机科学与Python编程导论_MIT 学习笔记(二)
- MIT公开课:计算机科学及编程导论 Python 笔记4 函数分解抽象与递归
- MIT麻省理工学院公开课:计算机科学及编程导论 Python 笔记1-3
- MIT计算机科学及编程导论02课学习笔记
- MIT公开课:计算机科学及编程导论 Python 笔记5 浮点数,逐次逼近法和二分法
- MIT开发课程-计算机科学及编程导论-列表和可变性、字典、效率简介-笔记
- MIT6.00.1X 计算机科学和PYTHON编程导论 第三周
- MIT开发课程-计算机科学及编程导论-课程简介及数据类型-笔记
- MIT6.00.1X 计算机科学和PYTHON编程导论 第四周
- 学习日记-MIT[计算机科学与编程导论]-5
- MIT6.00.1X 计算机科学和PYTHON编程导论 第一周
- 学习日记-MIT[计算机科学与编程导论]-6
- MIT 6.00.01X 计算机科学和Python编程导论 week1
- MIT6.00.1X 计算机科学和PYTHON编程导论 第五周
- MIT 6.00.1x 计算机科学和Python编程导论 Set 2