2016-04-12 41 views
0

此过程应该返回一个列表,其中包含3个给定列表中的备选值。例如(alt('a b c)'(1 2 3)'(i j k))应该返回'(a 1 i b 2 j c 3 k)。返回3个给定列表的交替元素。计划

这是我迄今为止的逻辑。我将采用每个列表的第一个元素,并以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

给定的()”

(利弊广告)返回一个新第一个元素是a和第二个元素的分配对是d。但是由于有3个不是2个给定的列表,还有另一种方法来创建列表吗?

这是另一种方法吗?

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

回答

2

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

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

我明白了,这是有道理的。感谢您的答复。 – wooot

1

你可以使用下面的标准方案:

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

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

评估和演示:http://eval.ironscheme.net/?id=175

相关问题