关闭

Scheme&FP上路

572人阅读 评论(1) 收藏 举报
看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)))))))
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3812次
    • 积分:77
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章存档
    阅读排行
    最新评论
  • Scheme&FP上路

    zhcosin: 我现在才开始看这本书,原先一直用的C/C++,现在正在思考一个求幂的方法,乘法运算要尽可能的少。