首页 文章

返回3个给定列表的备用元素 . 方案

提问于
浏览
0

此过程应该返回一个列表,其中包含来自3个给定列表的备用值 . 因此,例如(alt('a b c)'(1 2 3)'(i j k))应返回'(a 1 i b 2 j c 3 k) .

到目前为止,这是我的逻辑 . 我将采用每个列表的第一个元素,并以cdr作为新参数再次递归调用该过程 .

(define (alternate lst1 lst2 lst3)
    (cons (car lst1)
          (cons (car lst2)
                (cons (car lst3)
                (alternate (cdr lst1)(cdr lst2)(cdr lst3))))))

发生错误

(cons (car lst1)

“mcar:违反 Contract

预计:mpair?

给予()”

(cons a d)返回一个新分配的对,其第一个元素是a,第二个元素是d . 但是,由于有3个不是2个给定列表,是否还有另一种方法来创建列表?

这会是另一种方法吗?

(define (alternate lst1 lst2 lst3)
    (list (car lst1)(car lst2)(car lst3))
        (alternate (cdr lst1)(cdr lst2)(cdr lst3)))

2 回答

  • 2

    您可以使用以下标准方案:

    (define (alternate . lists)
      (apply append (apply map list lists)))
    

    不是很优化,但做的工作:)

    评论:http://eval.ironscheme.net/?id=175

  • 1

    您需要添加空列表检查以避免错误 . 所以你的代码应该是这样的:

    (define (alternate lst1 lst2 lst3)
      (if (or (null? lst1) (null? lst2) (null? lst3))
          '()
          (cons (car lst1)
            (cons (car lst2)
              (cons (car lst3)
                (alternate (cdr lst1)(cdr lst2)(cdr lst3)))))))
    

    如果你可以使用SRFI-1(或更确切地说是 append-map ),那么你也可以这样写:

    (define (alt l1 l2 l3) (append-map list l1 l2 l3))
    

相关问题