看SICP,发现自己越来越笨了,一段简单的程序都要想半天。
不过Scheme确实是抽象程度比价高的语言,习惯了C++/Java等逻辑程序设计语言,一下子用函数式程序设计语言的角度看问题还真有点反 应迟钝。逻辑程序设计语言里数据结构定义丰富自由,可以定义很直观易于理解的数据结构,算法是跟数据结构紧密相关的。而在Scheme里面,数据结构就是 list一种,复杂的结构如树等都是基于list的抽象。而且Scheme里没有诸如for,while之类的循环结构,一切皆过程。逻辑程序设计语言里 的for,while结构在Scheme中由过程的嵌套调用实现,这种嵌套调用是一种线性迭代过程,或者说是尾递归。Scheme中的递归过程分为递归计 算过程和迭代计算过程(From: SICP),一开始看的时候有些困惑,后来对照写程序就有点悟了。 不过还是有很多概念理解得不透彻,还需要继续洗脑。
抽空做了SICP的几个简单的练习,fringe将树状结构的页节点转换为一个list,这里采用的是线性迭代过程 :(fringe (list (list 1 2) 3 (list 4 5))) ==> (1 2 3 4 5)
(define (fringe lists)
(define (fringe-iter lists answer)
(cond ((null? lists) answer)
((not (pair? lists)) (append answer (list lists)) )
(else (append (fringe-iter (car lists) answer) (fringe-iter (cdr lists) answer)) ) ))
(fringe-iter lists (list)))
(define (fringe-iter lists answer)
(cond ((null? lists) answer)
((not (pair? lists)) (append answer (list lists)) )
(else (append (fringe-iter (car lists) answer) (fringe-iter (cdr lists) answer)) ) ))
(fringe-iter lists (list)))
reverse将树状结构进行倒置,和fringe一样,也用的是线性迭代过程。
(reverse (list (list 1 2) (lit 3 4))) ==> ((3 4) (1 2))
(define (reverse tree)
(define (reverse-tree tree answer)
(cond ( (null? tree) answer)
( (not (pair? tree)) (cons tree answer))
( else (reverse-tree (cdr tree) (cons (car tree) answer )))))
(reverse-tree tree (list ))
)
deep-reverse将树状结构进行深度倒置,即子树的子树也进行倒置。这是一个线性递归过程.
(define (reverse-tree tree answer)
(cond ( (null? tree) answer)
( (not (pair? tree)) (cons tree answer))
( else (reverse-tree (cdr tree) (cons (car tree) answer )))))
(reverse-tree tree (list ))
)
deep-reverse将树状结构进行深度倒置,即子树的子树也进行倒置。这是一个线性递归过程.
(deep-reverse (list (list 1 2) (list 3 4))) ==> ((4 3) (2 1))
(define (deep-reverse tree)
(cond ( (null? tree) (list))
( else (append (deep-reverse (cdr tree))
(list (if (list? (car tree)) (deep-reverse (car tree))
(car tree)))))))
(cond ( (null? tree) (list))
( else (append (deep-reverse (cdr tree))
(list (if (list? (car tree)) (deep-reverse (car tree))
(car tree)))))))