【问题标题】:Scheme - car/cdr on empty list方案 - 空列表上的汽车/cdr
【发布时间】:2012-01-10 05:02:30
【问题描述】:

我写了一个使用 car 和 cdr 的大程序,然后这样做:

(map car (append (map caddr lists) (map cadr lists))

lists 是下一个格式的列表列表时((a (b) (c)) (d (e) (f))...(x (y) (z))) 当我这样做时,我得到了一份清单(b c e f... y z) (注:b,c,...y,z 是数字列表;a,d...x 是符号)

但是现在,我发现 b,c,...,y,z 也可以是空列表,并且它给出了下一个错误:

car: expects argument of type <pair>; given ()

我能做什么?

【问题讨论】:

  • 那么如果 (b c ...) 为空,你希望它做什么?返回空列表?
  • @shaun:没什么。我不需要它们(b c ....)。我尝试删除空列表,但没有成功。

标签: scheme


【解决方案1】:

您是否尝试过在map 之前过滤掉空列表?像这样的:

(map car (filter pair? (append (map caddr lists) (map cadr lists))))

根本问题是() 不是对,而car 只作用于对。最简单的解决方案是在将car 映射到列表之前删除所有不是对的东西;这就是(filter pair? ...) 所做的。

【讨论】:

  • 我认为应该是(map car (filter pair? (append (map caddr lists) (map cadr lists))))
  • @mangoDrunk:你说得对;我只是没有给予足够的关注。
【解决方案2】:

这是我的镜头。这是一个直接的解决方案,不使用mapfilter;这样,我避免了一遍又一遍地构建中间列表的列表元素——除了我使用reverse 操作来保留元素的原始顺序,如果这不是问题,请删除reverse。对于原始列表中的每个元素,如果 (b)... (c)... 部分为空,则跳过。

(define (process lists)
  (let loop ((l (reverse lists))
             (a '())
             (b '()))
    (cond ((null? l)
           (append b a))
          ((or (not (pair? (cadar l))) (not (pair? (caddar l))))
           (loop (cdr l) a b))
          (else
           (loop (cdr l) (cons (caadar l) a) (cons (car (caddar l)) b))))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2018-01-12
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多