P07 (**) 铺开(flatten) 嵌套列表

本文介绍了嵌套列表的概念及其实现flatten的方法,包括自造轮子的方式和使用reduce函数两种实现方式。

nestable列表是说它的元素可以是列表,与之相对,把不包含列表作为元素的列表称为flat 列表。嵌套列表跟树结构类似,父节点可以包含多个子节点,每个子节点都可以是树结构,无限纵深。实际上在Scheme中常用nestable列表表示数结构,铺开(flatten)列表,也跟树的深度优先遍历类似,都是一个递归的过程。如:

 sash> (my-flatten '(a (b (c d) e)))
 sash> (a b c d e)
(1)自己造轮子
(define my-flatten
    (lambda (ls)
      (if (null? ls)
          '()
          (let ([h (car ls)])
            (cond
              [(list? h) (append (my-flatten h)
                                 (my-flatten (cdr ls)))]
              [else (cons h (my-flatten (cdr ls)))])))))
(2)使用reduce

MapReduce这几年随着Hadoop的流行而声名大噪,其思想来源于函数式编程中的map和reduce函数。在R6RS和SRFI-1中,都提供了reduce函数的两个变种:fold-left和fold-right。下面用fold-right实现:

(import (srfi 1))
(define my-flatten
    (lambda (ls)
      (fold-right (lambda (e a)
                   (if (list? e)
                       (append (my-flatten e) a)
                       (cons e a))) '() ls)))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值