600X笔记(week-2 简单算法与函数)

这节课从猜测验证算法开始,猜测答案,到检验,再到用检验结果去改进猜测,这样的自然地引用到迭代概念(非直线,非分支)。
运用迭代的这种猜测和检验方法可以归纳到更为广泛的算法组中:逐步逼近法(穷举法)、二分查找法

关于浮点数的穷举法:

十进制转化二进制:

#!/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 = 0
isNeg = None
if x < 0:
    isNeg = True
while (2**p*x%1) != 0:
    p +=1

x = 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 = 0
while x < 10:
    x += 0.1
print(x) #输出结果是10.09999999999998

那么问题又来了,既然计算机表达不了0.1,那么我平时敲的0.1是什么来的,事实上是设计者设定的成这样的模式,也就是它自动去掉一些位,使得更加整洁,但事实上,机器内部,0.1并不代表于我们想象当中的0.1。掌握这概念对关于浮点数的猜测和检验算法很重要,比如步长以及当检验时,浮点数不精确的事实必须纳入检验的考虑范围

二分法

二分法应当非常适合用于拥有排序属性的问题,即待求数据仅随输入值变化。比方说我所求的值是g的平方根,它随着g的增大而增大,而取中间值的方法能使我能更方便地在每一阶段,将问题缩小一半。

'''
二分法计算平方根(仅限于大于或等于1)
'''

x = input("enter a num:")
x = int(x)
g = 0
s = 0
e = x
t = 0
while 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:
        break
print(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

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

posted @ 2017-06-24 23:42  Seiei  阅读(129)  评论(0编辑  收藏  举报