Return 3 个给定列表的备用元素。方案
Return alternate elements of 3 given lists. Scheme
此过程应该return 一个列表,其中包含来自 3 个给定列表的备选值。因此,例如 (alt ('a b c)'(1 2 3)'(i j k)) 应该 return '(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:违反合同
预期:mpair?
给定()
(cons a d) returns 一个新分配的对,其第一个元素是 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)))))))
如果你可以使用SRFI-1(或者更准确地说append-map
),那么你也可以这样写:
(define (alt l1 l2 l3) (append-map list l1 l2 l3))
您可以使用以下标准方案:
(define (alternate . lists)
(apply append (apply map list lists)))
不是很优化,但是可以了:)
此过程应该return 一个列表,其中包含来自 3 个给定列表的备选值。因此,例如 (alt ('a b c)'(1 2 3)'(i j k)) 应该 return '(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:违反合同
预期:mpair?
给定()
(cons a d) returns 一个新分配的对,其第一个元素是 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)))))))
如果你可以使用SRFI-1(或者更准确地说append-map
),那么你也可以这样写:
(define (alt l1 l2 l3) (append-map list l1 l2 l3))
您可以使用以下标准方案:
(define (alternate . lists)
(apply append (apply map list lists)))
不是很优化,但是可以了:)