Lisp/SICP
thinkerleo7798
这个作者很懒,什么都没留下…
展开
-
SICP 2.28 遍历二叉树的叶子节点
原理很简单,纯递归scheme代码:> (define (fringe m) (cond ((null? m) '()) ((not (pair? (car m))) m) (else (append (fringe (car m)) (fringe (cdr m))))))> (fringe (list (list 1 2原创 2017-01-13 12:15:33 · 381 阅读 · 0 评论 -
SICP 建立二叉查找(排序)树
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值; (3)左、右子树也分别为二叉排序树; 在scheme和其他lisp家族语言中,二叉树常用list(列表)的嵌套来表示二叉树。 二叉树有三个节点,用scheme代码表示:(define (ent原创 2017-01-29 22:55:37 · 495 阅读 · 0 评论 -
SICP 2.59 集合的合并union_set
现在有两个集合set1 和 set2, 需要将这两个集合合并成一个集合。 思路很简单: 顺序查找set1中的元素set2是否包含,是,则找下一个,否,加入到set2。 最后返回set2scheme 实现:(define (union_set set1 set2) (if (null? set1) set2 (union_set (cdr set1) (a原创 2017-01-26 15:46:25 · 394 阅读 · 0 评论 -
SICP 2.42 “八皇后问题”及“n皇后问题”
八皇后问题: 在国际象棋棋盘(8x8)上,摆八个皇后,任意一个皇后都不能攻击另一个皇后(也就是说:任意两个皇后都不能在同一行,不能在同一列 ,不能在同一对角线) 递归地解释这个问题:假设我们已经生成了棋盘k-1列中k-1个皇后的所有可能方式,现在需 要的就是对其中每种方式,生成出将下一个皇后放在k列每一行的扩充集合。把每次递归过程抽象为几步:(k-1)行前的皇后位置表和第k行组合成所有可能的位原创 2017-01-19 00:10:30 · 1190 阅读 · 0 评论 -
SICP 2.2 嵌套映射
这一节,我们来做一个map,筛选出以下下数对里和为素数的数对 c/r 1 2 3 4 1 (1 1) 2 (2 1) (2 2) 3 (3 1) (3 3) 4 (4 1) (4 2) (4 3) (4 4)这种生成素数序对的过程,可以抽象成以下两个大过程: 构建序对—-筛选序对 函原创 2017-01-17 22:50:46 · 466 阅读 · 0 评论 -
SICP 2.27 deep_reverse (迭代+递归)
练习2.27:现有 (list (list 1 2) (list 3 4 5)) 将其翻转构造成 (list (list 5 4 3) (list 2 1)) scheme代码:**(define (deep_reverse tree) (define (deep_reverse_it tree re) (cond ((null? tree) re)原创 2017-01-13 11:32:04 · 641 阅读 · 0 评论 -
SICP 2.38 研究递归和迭代模型
之前讨论的过程accumulate也称作fold_right(右展开),因为它将序列的第一个元素组合到右边所有元素的结果上。相对的,也有个fold_left(左展开),将左边的结果加到右边的元素上。 fold_right的scheme代码:> (define (fold_left op initial sequence) (define (iter result rest) (原创 2017-01-17 01:25:06 · 515 阅读 · 0 评论 -
SICP 2.35 树叶子节点的数量
这个问题并不难,但是要迎合出题人的格式:(define (count_leaves t) (accumulate <??> <??> (map <??> <??>)))Scheme代码:> (define (count_leaves t) (accumulate + 0 (map (lambda (t) (if (pair? t)原创 2017-01-15 22:49:44 · 433 阅读 · 0 评论 -
SICP 2.34多项式加法
对于一个多项式: 求值,我们可以化简找出其规律,利用Horner 规则化简: 可以明显看出多项式的递归规律:从an开始,(+ (* an x) a(n-1)),下一个也是如此,直到a0。 之前建立的accumulate过程,也有相似的递归性,应该是一类过程,accumulate的原始定义:(define (accumulate op initial sequence) (if原创 2017-01-15 20:38:36 · 386 阅读 · 0 评论 -
SICP 2.2.3 对一种数据处理过程的抽象
有一个很简单的问题:对0到n的整数中的偶数的斐波那契数求和。 不对它进行高级抽象的话,问题应该是这样解决的: Scheme代码:(define (even_fib n) (define (even_fib_it m re) (if (= m n) (+ re (fib m)) (even_fib (+ m 1) (+ re原创 2017-01-14 17:40:01 · 443 阅读 · 0 评论 -
SICP 2.30 && 2.31square_list (树的平方映射)
要求:有一棵树 (list 1 2 3 (list (list 4) 5) 6),将其转换为树 (1 4 9 ((16) 25) 36) 方案一:二叉递归(我根据自己的理解起得名字LOL)> (define (square_tree tree) (cond ((null? tree) '()) ((not (pair? tree))原创 2017-01-13 21:36:54 · 373 阅读 · 0 评论 -
有趣的Scheme:lat? 函数的实现
最近在读一本叫《The Little Schemer》的小册子,是Scheme语言的入门书。之前在看SICP的时候有用到过Scheme,但是对这个Lisp方言的理解并没有那么深刻,现在把它读一读,对这个函数式语言的理解应该会加深些吧。 我把这个系列的博客命名为 “有趣的Scheme”,因为函数式语言真的是太有魅力了,代码很美,逻辑严谨,设计超前等等优点 这是本书留给读者的第一个问题:设计一个la原创 2017-09-10 23:14:32 · 963 阅读 · 0 评论