SICP_Python版第二章(1)
来源:互联网 发布:单片机led灯不亮 编辑:程序博客网 时间:2024/05/16 12:33
练习 以下是关于有理数的定义和计算,通过最大公约数和对负号的处理,进行化简。
from fractions import gcdfrom operator import getitemdef make_rat(n, d): if n*d < 0:n,d = -abs(n),abs(d) g = gcd(n,d) return (n//g,d//g)def numer(x): return getitem(x, 0)def denom(x): return getitem(x, 1)def add_rat(x,y): nx,ny = numer(x),numer(y) dx,dy = denom(x),denom(y) return make_rat(nx*dy+ny*dx,dx*dy)def sub_rat(x,y): return add_rat(x,make_rat(-numer(y),denom(y)))def mul_rat(x,y): nx,ny = numer(x),numer(y) dx,dy = denom(x),denom(y) return make_rat(nx*ny,dx*dy)def div_rat(x,y): return mul_rat(x,make_rat(denom(y),numer(y)))def str_rat(x): return '{0}/{1}'.format(numer(x),denom(x))a = make_rat(-3,-5)b = make_rat(4,-6)print(str_rat(add_rat(a,b)),str_rat(sub_rat(a,b)),str_rat(mul_rat(a,b)),str_rat(div_rat(a,b)))
练习 设计一些产生和运算点,线的过程
def make_segment(b_p,e_p): return (b_p,e_p)def start_segment(s): return getitem(s,0)def end_segment(s): return getitem(s,1)def make_point(x,y): return (x,y)def x_point(p): return getitem(p,0)def y_point(p): return getitem(p,1)def midpoint_segment(s): b_p,e_p = start_segment(s),end_segment(s) return make_point(0.5*(x_point(b_p)+y_point(e_p)), 0.5*(y_point(b_p)+y_point(e_p)))def str_point(p): return '({0},{1})'.format(x_point(p),y_point(p))s = make_segment(make_point(0,5),make_point(2,4))print(str_point(midpoint_segment(s)))
练习定义一个平面上矩形的表示方式,并且定义一个过程用来计算它的面积,周长。用另外一种方式定义矩形,并保证计算面积和周长的函数还能继续使用
PS:这道题很重要,可以加深对AbstractionBarrier的理解 ,想要成功定义一个合理且灵活的体系,最关键的是要考虑到基本元素的适用性。任何一个矩形无论怎么定义,一个有长和宽这两个基本元素。所以可以利用这两个元素作为抽象屏障,来计算面积和周长。反之,如果使用顶点的概念来进行抽象过程的定义,那么如果矩形不是垂直或平行于坐标轴的图像,这个顶点的定义将不适用!当然,为了简单起见,第一种定义还是使用顶点法:
def compute_area(rec): return width(rec)*height(rec)def compute_length(rec): return 2*(width(rec)+height(rec)) def make_rec(p1,p2): return (p1,p2) def top_left(rec): return getitem(rec,0) def low_right(rec): return getitem(rec,1) def height(rec): p1 = top_left(rec) p2 = low_right(rec) return y_point(p1)-y_point(p2) def width(rec): p1 = top_left(rec) p2 = low_right(rec) return x_point(p2)-x_point(p1)
Implemention(b)
这种定义让我们可以以任意两条边来定义一个矩形,当然作为代价,我们要对输入的参数进行排序和处理,这样就可以忽略两条边的关系是(垂直/平行)什么。
def make_rec(s1,s2): return (s1,s2)def side1(rec): return getitem(rec,0)def side2(rec): return getitem(rec,1)def get_bounds(rec): s1,s2 = side1(rec),side2(rec) p1,p2 = start_segment(s1),start_segment(s2) p3,p4 = end_segment(s1),end_segment(s2) xs = set([x_point(p1),x_point(p2),x_point(p3),x_point(p4)]) ys = set([y_point(p1),y_point(p2),y_point(p3),y_point(p4)]) return xs,ysdef width(rec): xs,ys = get_bounds(rec) return max(xs)-min(xs)def height(rec): xs,ys = get_bounds(rec) return max(ys)-min(ys)
0 0
- SICP_Python版第二章(1)
- SICP_Python版第二章
- 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编码
- 《Effective java》笔记(第二版) --第二章(1-3)
- Python基础教程第二版读书笔记-第二章
- python(第二版)第二章答案
- 嵌入式linux基础教程第二版 第二章
- SQL第二章1
- 第二章 1节
- C#第二章1
- python学习——匿名函数
- double和float转换的问题
- 移动文件到某个目录下如果没有该文件夹即创建该文件夹
- Eclipse快捷键 10个最有用的快捷键
- java将json字符串转成List/Map实例
- SICP_Python版第二章(1)
- spring BeanWrapperImpl方便的嵌套属性(list)操作
- 【Shiro】Apache Shiro架构之权限认证(Authorization)
- iOS8 的毛玻璃效果(UIVisualEffectView)
- hdu 1049 Climbing Worm
- java spring定时器(注解)
- 写了一个 51单片机外部中断程序
- 32.Python的单元测试工具——unittest(初级)
- myeclipse 连接mysql 提示 unable to create connection.check your url