P05 (*) 反向列表中元素

如,反向之前'(1 2 3)
反向之后变为'(3 2 1)

R7RS的(scheme base)提供了reverse,没有副作用,纯的函数式版本。(srfi 1)提供了mutation版本reverse!,会改变原有列表的结果,有副作用。

不管有无副作用,实现的思路是一样的。给出实现:

(1)“Pure“版本my-reverse
(define my-reverse
    (lambda (ls)
      (let f ([ls ls] [new '()])
        (if (null? ls)
            new
            (f (cdr ls) (cons (car ls) new))))))
(2)“Mutation“版本my-reverse!
(define my-reverse!
    (lambda (ls)
      (let f ([ls ls] [new '()])
        (if (null? ls)
            new
            (let ([t (cdr ls)]) (set-cdr! ls new) (f t ls))))))

唯一的区别是:(1)用cons建立新列表,而(2)使用set-cdr!改变列表元素间的连接关系。

图示如下,实线是反向前原有列表元素连接关系,虚线是反向后元素连接关系。注意:(eq? '() '())#t,'()是唯一的,所以所有列表结尾都指向同一个'()
pure
pure版本

mutation
mutation版本

——-2015/12/20 更新——–

使用fold-left更简单

(import (srfi 1))
(define my-reverse
    (lambda (ls)
      (fold-left (lambda (a e)
                   (cons e a))
                 '()
                 ls)))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值