![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
SICP学习笔记
PYB不开心
这个作者很懒,什么都没留下…
展开
-
SICP学习笔记(1):
[0]:学会了基本使用scheme命令行和基本表达式:(1)第一个代码文本里面,用前缀表达式来定义计算.;The first program(define x (+ (* 3 (+(* 2 4) (+ 3 5))) (+(- 10 7) 6)))(define A (* x原创 2016-03-16 23:02:44 · 419 阅读 · 0 评论 -
SICP_Python版:抽象数据的多重表示
这一节以复数的运算为例子,展示了怎样实现基于不同表示方式的抽象数据。(1):基于添加标签的抽象数据表示:(1):基于添加标签的抽象数据表示:实现了基于直角坐标和极坐标的两种表示方式,同时通过添加标签可以两种表示方式一起使用。from math import atan,sin,cosdef add_complex(z1,z2): return make_from_real_imag(rea原创 2016-08-01 19:58:12 · 393 阅读 · 0 评论 -
SICP_Python版:Chapter 2:Implement simple object system
SICP介绍了如何利用简单的闭包来保存状态,从而来构造一个简单的object系统,加深对python object system实现的理解.(1)实现类的构造:(1) 实现类的构造:很容易理解这个代码:首先看参数是一个dictionary,里面存储着一个类的各个属性(property,method).我们将这个attributes作为参数保存起来,然后创建一改局部的dict里面有两个key_valu原创 2016-08-27 20:32:20 · 472 阅读 · 0 评论 -
SICP_Python版第二章:符号数据(简易求导系统)
2.54判断两个列表是否相等2.54 判断两个列表是否相等和scheme里面不同,这里需要加上类型判断,长度的判断可以通过对最终情况的分析来避免。当然python早就内置好了==运算符号…def equal(a,b): def rest(x):return x[1:] if len(x)!=0 else None if not (a and b):return True if a==原创 2016-07-22 16:13:22 · 905 阅读 · 0 评论 -
SICP_Python第二章:映射(子集问题,排列问题,N皇后问题)
下面是自己实现的map方法。def simple_map(proc,items): result = [] for item in items: result.append(proc(item)) return resultdef scale_list(items,factor): return simple_map(lambda x:x*facto原创 2016-07-16 17:55:33 · 623 阅读 · 0 评论 -
SICP_Python版本:Hufuman编码
采用递归定义来构造hufuman树,且进行编码解码。def make_leaf(symbol,weight): return ('leaf',symbol,weight)def is_leaf(obj): return obj[0]=='leaf'def weight_ofleaf(x):return x[2]def symbol_ofleaf(x):return x[1]d原创 2016-07-29 21:40:46 · 536 阅读 · 0 评论 -
SICP_Python版本第二章:序列作为约定界面
利用reduce,map,filter,[expressionforinsiftest(s)]可以进行模块化的设计,大大减少了编程的负担利用reduce,map,filter,[expression for i n s if test(s)]可以进行模块化的设计,大大减少了编程的负担比如下面,一行代码就写出fib数列的前n项,然后再过滤求和。def sum_even_fibs(n): s =原创 2016-07-17 18:59:13 · 508 阅读 · 0 评论 -
SICP_Python版第2章:递归的定义序列
我们可以通过递归的方式来定义序列,由于是通过tuple来定义的,所以比起正常的序列,感觉很别扭。练习2.17练习2.17定义一系列有关序列的结构empty_rlist = Nonedef make_rlist(first, rest): return (first, rest)def first(s): return s[0]def rest(s): return s[原创 2016-07-16 15:32:14 · 396 阅读 · 0 评论 -
SICP_Python版第二章
数据结构的过程性表示:习题2.5习题2.5:证明很容易,假设存在a<0或者b<0,则Pair(a,b)=2a3|b|或者3b2|a|Pair(a,b) = \frac{2^a }{3^{\vert b\vert}} 或者 \frac{3^ b }{2^{\vert a \vert}}因为gcd(2,3)=1,所以Pair(a,b)不能继续约分,所以Pair(a,b)不是整数。因此可以只用非负数来表示原创 2016-07-15 19:16:20 · 354 阅读 · 0 评论 -
SICP_Python版第二章:集合的表示
构造最简单也最低效的集合表示法def first(x):return x[0]def rest(x):return x[1:]def element_of(x,s): if len(s)==0:return False elif x==first(s):return True return element_of(x,rest(s))def adjoinset(x,s):原创 2016-07-24 12:46:45 · 413 阅读 · 0 评论 -
SICP_Python版第二章(1)
练习练习以下是关于有理数的定义和计算,通过最大公约数和对负号的处理,进行化简。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原创 2016-07-11 18:10:35 · 489 阅读 · 0 评论 -
SICP-Python版本(1.7)
因为无意中看见有人推荐的伯克利的这本教材,使用python教SICP,感觉使用起来更得心应手,毕竟scheme的括号太多用起来不习惯…虽然python不能支持所有的FP特性,但是作为一个初学者,让自己学起来有兴趣才是最重要的,以后全部都用Python来做啦!(1)(1)首先用python实现一个抽象的Product,并用来定义一个计算PI4=23434565....\frac{PI}{4} = \f原创 2016-07-10 23:10:01 · 5513 阅读 · 0 评论 -
SICP学习笔记:用高阶函数作抽象(1)
我们可以通过定义一个通用的sum来进行求和.传入过程作为参数练习1.29,利用辛普森法则进行积分求和,需要注意的一点是闭包的性质,在integral里面的参数都是可以直接用在里面的闭包里面的.(define (sum f a next b) ( if(> a b) 0 (+ (f a) (sum f (next a) next b)) ))原创 2016-03-31 15:00:53 · 581 阅读 · 0 评论 -
SICP学习笔记:求幂,用对数的算法复杂度解决fib数列
练习1.16,用来求一个数的幂,线形迭代的过程.讨论了正数和负数的情况(define (do-expt b n) (cond ((> n 0) (fast-expt b b n)) ((= n 0) 1) (else (/ 1 (fast-expt b b (- 0 n))))原创 2016-03-24 22:52:10 · 511 阅读 · 0 评论 -
SICP笔记(3)
[0]本部分内容主要讲述了shceme中计算过程递归和递归过程的概念,所谓计算过程递归是在计算的时候需要解释器保存额外的信息,而递归过程则是代表这个过程的定义是递归的.递归的过程不一定导致计算过程的递归,一个重要原因是很多解释器可以用尾递归来优化它.练习1.10:(define (A x y) (cond ((= y 0) 0) ((= x 0)(原创 2016-03-18 12:20:11 · 333 阅读 · 0 评论 -
SICP学习笔记(4)
[1]树型递归就是典型的fib数列,然后转换为迭代的尾递归形式.可以大大增加效率.练习1.11,f(n) = f(n-1)+2f(n-2)+3(n-3) (n>=3)f(n) = n (n<3),用两种方式求f(n); (define (f n) ( ; if (< n 3) ; n ; ( + ( f (- n 1)) (* 2 (f (- n 2)))原创 2016-03-19 15:57:34 · 434 阅读 · 0 评论 -
SICP学习笔记:最大公约数和素数检测
[0]最大公约数:求最大公约数的一个简单办法是欧几里德算法.对于a,b,GCD(a,b)= GCD(b,r)。b是a/b的余数证明如下:a = kb + r(1),设 m = GCD(a,b),a = m*a1,b = m*b1.所以 (1)可以变形: a1 = kb1 + r/m;显然r/m必然是一个整数,记为r1。得到a1 = kb1 + r1(2)。现在证明m也是b和r的最大公约数,只须证b1原创 2016-03-27 17:12:41 · 511 阅读 · 0 评论 -
SICP学习笔记(2)
牛顿法求根;The first program(define (abs x) ( if(< x 0) (- x) x ))(define (square x) (* x x) )(define (average x y) (/ (+ x y) 2))(define (improve guess x)(avera原创 2016-03-17 21:55:12 · 309 阅读 · 0 评论 -
SICP_Python版第三章:递归与迭代
这一章的开头讲了两种递归的方式,树状和线性。其实就是原版SICP第一章讲过的。(1)(1)书上给出了一个很精巧的程序用来描述一个过程,这个过程将树状递归的函数通过空间换时间的方式改写成一个线性递归的结构。这段代码的精巧之处在于,通过f参数来绑定原来的递归函数。然后通过memo函数的返回值将原来递归函数的名字绑定在memorized这个函数上面。这样一旦调用f,它内部的两个fib就不再调用本身,而是调原创 2016-08-31 11:42:13 · 659 阅读 · 0 评论