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)))))))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值