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

这两个习题的总结,在使用穷举法的时候,一定要清楚究竟要如何实现检测的范围逐步减少

原创粉丝点击