600X笔记(week-2 简单算法与函数)
来源:互联网 发布:apache闪退 编辑:程序博客网 时间:2024/06/05 02:42
这节课从猜测验证算法开始,猜测答案,到检验,再到用检验结果去改进猜测,这样的自然地引用到迭代概念(非直线,非分支)。
运用迭代的这种猜测和检验方法可以归纳到更为广泛的算法组中:逐步逼近法(穷举法)、二分查找法。
关于浮点数的穷举法:
十进制转化二进制:
#!/usr/bin/env python3# -*- coding: utf-8 -*-'''靠的是拆分理解,除2求余数,如 x = 1*2^4 + 0*2^3 + 1*2^2 + 0*2^1 +1*2^0'''x = input("Enter a int:")x = int(x)ans = ""if int(x)<0: isNeg = True #判断是否为负数 x = abs(x)if x ==0: print("result: 0")while x > 0: ans = str(x % 2) + ans #运用字符串的组合方法 x=x//2 #舍去余数 print(x)if isNeg: print("result: " + "-" + ans)else: print("result: "+ans)
然而这只是整数的,那么小数的呢?代码如下
#!/usr/bin/env python3# -*- coding: utf-8 -*-'''只需找一个p的幂次与之相乘转化为整个数集,然后按整数的方法转化为二进制,最后退回小数点就可以了'''x = input("enter a float:")x = float(x)ans = ""p = 0isNeg = Noneif x < 0: isNeg = Truewhile (2**p*x%1) != 0: p +=1x = int(x*2**p)while x > 0: ans = str(x % 2) + ans #运用字符串的组合方法 x=x//2 #舍去余数ans = int(ans)*(10**(-p))if isNeg: print("result: " + "-" + str(ans))else: print("result: "+str(ans))
这差不多就是机器内部做的事情,然而有没注意到假如没有一个p可以使x*p**2
为整数(比如0.1),那么计算内部将一直是一个近似值,事实上,系统内部会最终会终止尝试扩展下去,只会给我们一些系统内部设置的任意数位。所以如果它不能通过p的幂次转化为整个数集,那么它永远都是一个近似值。
所以这样给了我们一些启示,比如我们要尝试两个浮点数是否相等就不能使用等号的方式了,因为它有可能因为近似值的原因导致结果不相等,因此基本上来说,我们会使用abs(x-y) < 0.0001
来代替x == y
,eg:
x = 0while x < 10: x += 0.1print(x) #输出结果是10.09999999999998
那么问题又来了,既然计算机表达不了0.1
,那么我平时敲的0.1
是什么来的,事实上是设计者设定的成这样的模式,也就是它自动去掉一些位,使得更加整洁,但事实上,机器内部,0.1
并不代表于我们想象当中的0.1
。掌握这概念对关于浮点数的猜测和检验算法很重要,比如步长以及当检验时,浮点数不精确的事实必须纳入检验的考虑范围。
二分法
二分法应当非常适合用于拥有排序属性的问题,即待求数据仅随输入值变化。比方说我所求的值是g的平方根,它随着g的增大而增大,而取中间值的方法能使我能更方便地在每一阶段,将问题缩小一半。
'''二分法计算平方根(仅限于大于或等于1)'''x = input("enter a num:")x = int(x)g = 0s = 0e = xt = 0while abs(x-g**2) > 0.0001: t += 1 g = s + (e-s)/2 if g**2 > x: e = g elif g**2 < x: s = g elif g**2 == x: breakprint(g)print("time:",t)
至于函数那节课,主讲的是环境变量与局部变量,这里贴两个习题增强一下理解。
'''第一题:编写一个函数,能在输入的文字中计算出`bob`这个字符串出现的次数'''def checkbob(str): maxnum = len(str) count = 0 if 'bob' in x:#直接看'bob'在不在,不在不用找 ordernumberL = 0 ordernumberR = 3 #起码三个字符 while b <= maxnum: if x[ordernumberL:ordernumberR] == 'bob': count += 1 ordernumberL += 1 #改变检验参数 ordernumberR += 1 #改变检验参数 print("Number of times bob occurs is:",count) else: print("Number of times bob occurs is: 0.")
'''第二题:将输入的字符串最长的、按字母排表顺序(相邻的字母可以相同)的字符串打印出来'''def b(x): alphabetical = 'abcdefghijklmnopqrstuvwxyz' ordernumberL = -1 ordernumberR = 0 a = '' result = '' L = [] for n in x: ordernumberR = alphabetical.find(n) if ordernumberR >= ordernumberL: a = a + n else: if len(result) > len(a): a = n #改变检测参数 else: result = a a = n #改变检测参数 ordernumberL = ordernumberR #改变检测参数 if result == '': result = a return result
这两个习题的总结,在使用穷举法的时候,一定要清楚究竟要如何实现检测的范围逐步减少
- 600X笔记(week-2 简单算法与函数)
- 600x笔记(week-3 递归与对象)
- 600X笔记 (week-5 效率与增长量级 内存与查找)
- 600X笔记(week-4 调试、断言和异常)
- 《算法分析与设计》Week 2
- 600X笔记(week-1 计算机科学简介及编程基础)
- 算法笔记(X) 模拟与仿真
- 算法笔记(VII) X算法与十字链表
- No1. week 1 简单匹配算法
- Week 2算法分析作业
- 《算法分析与设计》Week 1
- 《算法分析与设计》Week 3
- 《算法分析与设计》Week 6
- 《算法分析与设计》Week 7
- 《算法分析与设计》Week 8
- 《算法分析与设计》Week 9
- 《算法分析与设计》Week 10
- 《算法分析与设计》Week 11
- java script中的定时器控制文字
- centos7 python 2.7 和 python3兼容安装
- ajax知识总结系列之二
- SVG绘制中国地图
- Centos7-Tomcat启动很慢问题
- 600X笔记(week-2 简单算法与函数)
- LINUX环境配置SSH免密
- 今天在mac10.10上成功运行了android studio
- Java Web开发的几种模式总结
- Maven环境变量配置和Web创建及遇到的问题
- C#调用C++ Dll
- 从高考到程序员:我的程序探险之旅
- 今天搞清楚了一年半前的那次网络收包错误原因
- 最近的工作