SICP_Python版第二章

来源:互联网 发布:怎么看淘宝评价五星 编辑:程序博客网 时间:2024/06/04 20:03

数据结构的过程性表示:

2.5:证明很容易,假设存在a<0或者b<0,则
Pair(a,b)=2a3|b|3b2|a|

因为gcd(2,3)=1,所以Pair(a,b)不能继续约分,所以Pair(a,b)不是整数。因此可以只用非负数来表示序对。

表示的代码如下:

def make_pair(a,b):    def dispatch(m):        if m==0:            return a        else:return b    return dispatchdef getitem_pair(p,i):    return p(i)def make_integer(a,b):    return make_pair(a,b)def get_a(n):    return n(0)def  get_b(n):    return n(1)def mul(n1,n2):    a1,a2 = get_a(n1),get_a(n2)    b1,b2 = get_b(n1),get_b(n2)    return make_pair(a1+a2,b1+b2)def div(n1,n2):    a1,a2 = get_a(n1),get_a(n2)    b1,b2 = get_b(n1),get_b(n2)    return make_pair(a1-a2,b1-b2)def str_integer(n):    return '2^{0}*3^{1}'.format(get_a(n),get_b(n))print(str_integer(mul(make_pair(3,2),make_pair(2,3))))

2.72.8:

def add_interval(a,b):    return make_interval(lower_bound(a)+lower_bound(b),upper_bound(a)+upper_bound(b))def sub_inerval(a,b):    return make_interval(lower_bound(a)-upper_bound(b),upper_bound(a)-lower_bound(b))def mul_interval(a,b):    l1,l2,u1,u2 = lower_bound(a),lower_bound(b),upper_bound(a),upper_bound(b)    p1,p2,p3,p4 = l1*l2,l1*u2,u1*l2,u1*u2    return make_interval(min([p1,p2,p3,p4]),max([p1,p2,p3,p4]))def div_interval(a,b):    return mul_interval(a,make_interval(1/upper_bound(b),1/lower_bound(b)))def make_interval(l,u):    return (l,u)def lower_bound(m):    return getitem(m,0)def upper_bound(m):    return getitem(m,1)def str_interval(m):    return '[{0},{1}]'.format(lower_bound(m),upper_bound(m))x,y = make_interval(-1,2),make_interval(4,6)print(add_interval(x,y),mul_interval(x,y),div_interval(x,y),sub_inerval(x,y))

2.9(a):关于区间宽度,对于加法和减法,组合区间的宽度是关于两个区间宽度的函数:

W(add(a,b))=W(a)+W(b)=W(sub(a,b))....(1)

(b):对于乘法和除法,则不满足函数关系:显然,当存在负数的时候,它可能满足几种关于两个宽度的关系式。如(-1,3),(4,6)

2.100

def div_interval(a,b):    assert(lower_bound(b)*upper_bound(b) > 0)    return mul_interval(a,make_interval(1/upper_bound(b),1/lower_bound(b)))

2.11,,

思路就是一个区间有三种情况,然后3*3=9,当然写起来很是麻烦…..

def mul_interval(a,b):    def condition(l,u):        if l<0 and u<0:return 0        elif l*u <=0:return 1        return 2    l1,l2,u1,u2 = lower_bound(a),lower_bound(b),upper_bound(a),upper_bound(b)    index = condition(l1,u1)+condition(l2,u2)*3    if index == 0:return make_interval(u1*u2,l1*l2)    elif index==1:return make_interval(u1*l2,l1*l2)    elif index==2:return make_interval(u1*l1,l1*u2)    elif index==3:return make_interval(u2*l2,l2*u1)    elif index==4:return make_interval(min(l1*u2,l2*u1),max(l1*l2,u1*u2))#both span zero    elif index==5:return make_interval(u1*l2,u2*l2)    elif index==6:return make_interval(l1*u2,l2*u1)    elif index==7:return make_interval(l1*u2,u1*u2)    else:return make_interval(l1*l2,u1*u2)

2.12

def make_center_percent(a,b):    return (a,b)def center(m):    return getitem(m,0)def percent(m):    return getitem(m,1)def error(m):    return center(m)*percent(m)/100

2.13

:X=[ae1,a+e1],Y=[be2,b+e2]

XY=[abae2be1+e1e2,ab+ae2+be1+e1e2]

e=ae2+be1,c=ab+e1e2==>

ec=ae2+be1ab+e1e2=p1+p21+p1p2=p1+p2(while....p1,p2<<1)(p1=e1a,p2=e2b)

2.142.16:

简单的讲A/A!=1,因为我们的代码引入了不必要的不确定量,需要想办法确定每一个区间的身份。。。。这个超出了我的能力范围。

0 0