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.7−2.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.10,讨论除0错误 :
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=[a−e1,a+e1],Y=[b−e2,b+e2]
练习2.14−2.16 :
简单的讲A/A!=1,因为我们的代码引入了不必要的不确定量,需要想办法确定每一个区间的身份。。。。这个超出了我的能力范围。
0 0
- SICP_Python版第二章
- SICP_Python版第二章(1)
- SICP_Python版第二章:集合的表示
- SICP_Python版第二章:符号数据(简易求导系统)
- SICP_Python版本第二章:序列作为约定界面
- SICP_Python版第2章:递归的定义序列
- SICP_Python版第三章:递归与迭代
- SICP_Python第二章:映射(子集问题,排列问题,N皇后问题)
- SICP_Python版:抽象数据的多重表示
- SICP_Python版:Chapter 2:Implement simple object system
- SICP_Python版本:Hufuman编码
- Python基础教程第二版读书笔记-第二章
- python(第二版)第二章答案
- 嵌入式linux基础教程第二版 第二章
- 第二章 --- 第二节
- 【第二章 第二节】
- 第二章第二题
- 第二章第二题
- 语义化标签及其示例2
- 2016.07.14【初中部 NOIP提高组 】模拟赛C
- jQuery事件绑定on()、bind()与delegate() 方法详解
- [Codeforces 451E] Devu and Flowers (母函数+lucas定理)
- docker 入门
- SICP_Python版第二章
- An internal error occurred during: "SVN 检出". java.lang.ArrayIndexOutOfBoundsException
- UVA 11916 Emoogle Grid(离散对数、BSGS算法)
- 回家_纪中1445_bfs+二分
- java高并发之二---多线程基础
- Android 状态栏的控制
- bindPose(绑定姿势) 理解
- 一个很简单的输出从1到n个9
- 在Android应用中使用自定义证书的HTTPS连接(上)