Scheme 返回3个给定列表的替换元素。计划

Scheme 返回3个给定列表的替换元素。计划,scheme,racket,Scheme,Racket,此过程应该返回一个列表,其中包含3个给定列表中的可选值。因此,例如(alt('abc')(123jk))应该返回“(a1ib2c3k) 到目前为止,这是我的逻辑。我将获取每个列表的第一个元素,并以cdr作为新参数递归地再次调用该过程 (define (alternate lst1 lst2 lst3) (cons (car lst1) (cons (car lst2) (cons (car lst3) (

此过程应该返回一个列表,其中包含3个给定列表中的可选值。因此,例如(alt('abc')(123jk))应该返回“(a1ib2c3k)

到目前为止,这是我的逻辑。我将获取每个列表的第一个元素,并以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:违反合同

预期:百万美元

给定()

(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)))

您需要添加空列表检查以避免错误。因此,您的代码应该如下所示:

(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)))))))
(define (alt l1 l2 l3) (append-map list l1 l2 l3))
如果您可以使用SRFI-1(或者更准确地说是
append map
),那么您也可以这样编写:

(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)))))))
(define (alt l1 l2 l3) (append-map list l1 l2 l3))

您需要添加空列表检查以避免错误。因此,您的代码应该如下所示:

(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)))))))
(define (alt l1 l2 l3) (append-map list l1 l2 l3))
如果您可以使用SRFI-1(或者更准确地说是
append map
),那么您也可以这样编写:

(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)))))))
(define (alt l1 l2 l3) (append-map list l1 l2 l3))

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

(define (alternate . lists)
  (apply append (apply map list lists)))
不是很优化,但执行以下操作:)


评估:

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

(define (alternate . lists)
  (apply append (apply map list lists)))
不是很优化,但执行以下操作:)


Eval:

我明白了,这是有道理的。谢谢你的回复。我明白了,这是有道理的。谢谢你的回复。