计算机科学与Python编程导论_MIT 学习笔记(三)
来源:互联网 发布:python 日期减一天 编辑:程序博客网 时间:2024/06/07 07:42
while 循环的工作过程
1 bool检验
2 如果bool检验为真,执行循环体
3 返回bool检验
4 直到bool检验为假,停止循环,执行循环体外的程序
while 循环的必要组件
1 在循环之前设置迭代变量
2 在bool检验中检验迭代变量
3 在循环体中改变迭代变量的值
编程思路:以求立方根为例
设置ans作为猜测,从0开始猜,直到ans**3>给定值,然后结束循环,判断最后的ans是否等于给定值**3.
x=int(input())ans=0while ans**3<x: ans+=1if ans**3==x: print(str(x)+"'s root is "+str(ans))else: print(str(x)+' has no root')
算法思路:构建一个递减函数,描述猜测值与目标值之间的差距,通过循环,是差距不断变小,当差距大于等于零时,结束循环。
在上面的例子中,该函数为
这种猜测检查算法对有限可能的问题有效,这种穷举法穷举值域中的每个数。
for 循环的结构
for 循环的工作过程
1 标识符绑定到序列的第一个值
2 执行循环体
3 标识符绑定到序列的第二个值
4 执行循环体
5 重复直到标识符绑定到序列的最后一个值,并且执行完循环体,结束
6 或者中途遇到break,结束(跳出)循环
制作for循环中的序列:
例:求整数的立方根
x=int(input())for i in range(abs(x)+1): if i**3==abs(x): breakif i**3!=abs(x): print(str(x)+' has no root')else: if x<0: print(str(x)+"'s root is -"+str(i)) else: print(str(x)+"'s root is"+str(i))
for 循环利用值域(range)实现了穷举
例:将十进制整数转化为二进制数(注意python3.X中‘//’才是对正常除法结果向下取整)
x=int(input())if x<0: neg=True x=-xelse: neg=Falseif x==0: print(0)result=''while x>0: result=str(x%2)+result x=x//2if neg: print('-'+result)else: print(result)
例:将十进制浮点数转化为二进制数(注意python3.X中‘//’才是对正常除法结果向下取整)
x=float(input())p=0while (2**p)*x%1!=0: p+=1 print((2**p)*x-int((2**p)*x))num=int((2**p)*x)result=''while num>0: result=str(num%2)+result num=num//2for i in range(p-len(result)): result='0'+result print(result)print(str(x)+'='+result[0:-p]+'.'+result[-p:])
上个例子的启示:
1 若没办法在一定位数内找到某个浮点数的二进制等价,系统会采用近似的方法来替代
2 所以在比较两个浮点数是否相等时,最好用相减小于一个足够小的数,而不是用==
例:用浮点数近似立方根
x=float(input())epsilon=0.01step=epsilon**2ans=0.0count=0while (abs(ans**2-x))>=epsilon and ans<=x: ans+=step count+=1print(count)if abs(ans**2-x)>=epsilon: print('fail')else: print(str(x)+"'s root is close to "+str(ans))
例:二分法求方根
x = 25epsilon = 0.01count=0low=0.0high=float(x)ans=(low+high)/2while abs(ans**2-x)>=epsilon: count+=1 if ans**2>x: high=ans else: low=ans ans=(low+high)/2print(ans,count)
二分法的启示:
1 从根本上缩短循环次数
2 适用于有优先次序的问题,如求方根,g**2随g的增大而增大
牛顿拉夫逊算法
在求多项式p的根时,对于猜测g,一个更好的猜测是:
例:用牛顿拉夫逊算法求方根
x = float(input())epsilon=0.01ans=x/2.0count=0while abs(ans**2-x)>=epsilon: ans=ans-(((ans**2)-x)/(2*ans)) count+=1print(ans,count)
- 计算机科学与Python编程导论_MIT 学习笔记(三)
- 计算机科学与Python编程导论_MIT 学习笔记(一)
- 计算机科学与Python编程导论_MIT 学习笔记(二)
- 计算机科学与Python编程导论_MIT 学习笔记(四)
- 计算机科学与Python编程导论_MIT 学习笔记(五)
- 计算机科学与Python编程导论_MIT 学习笔记(六)
- MIT《计算机科学与编程导论》课堂笔记
- 计算机科学导论学习笔记
- 计算机科学导论学习笔记
- MIT公开课:计算机科学及编程导论 Python 笔记4 函数分解抽象与递归
- 计算机科学及编程导论学习笔记 第二课
- 学习日记-MIT[计算机科学与编程导论]-5
- 学习日记-MIT[计算机科学与编程导论]-6
- 学习日记-MIT[计算机科学与编程导论]-7,8
- 《编程导论(Java)•0.1 编程与计算机科学》
- MOOC:计算机科学及Python编程导论
- MIT 计算机科学和Python 编程导论
- MIT《计算机科学与编程导论》第六讲
- C编译过程
- jsp页面获取当前年月日
- Java中IO流详解
- 索引器
- 聊天页面设计中,遇到的几个bug
- 计算机科学与Python编程导论_MIT 学习笔记(三)
- flask-migrate初学
- webstorm对webpack中resolve进行智能提示
- Redis与Memcached的区别
- 颜值亮骚的Outlook风格导航控件
- 打印100~200之间素数的优化算法
- 17年App Store最新官方审核指南
- Coursera deeplearning.ai 深度学习笔记1-4-Deep Neural Networks-深度神经网络原理推导与代码实现
- 实践模仿拼多多官网小结