2016-04-12 86 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

相關問題