Scheme&FP上路

看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)))
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将树状结构进行深度倒置,即子树的子树也进行倒置。这是一个线性递归过程.
(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)))))))
阅读更多
想对作者说点什么? 我来说一句

PHP新手上路【word文档】

2009年02月01日 54KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭