2015-05-06 60 views
0

問題是什麼時候列表有不同的長度,任何想法如何做到這一點?關於如何在博士中交錯兩個列表的任何想法?

我不得不使用功能,如地圖或類似的

的東西這是我寫的,到目前爲止,它的工作原理相同長度的名單,但它也需要用不同長度的名單工作的代碼。謝謝。

(define (interleave list1 list2) 
(flatten [map (lambda (x y) (cons x (cons y null))) list1 list2])) 

如果名單有不同的長度,這是我所得到的:

地圖:所有的數組必須有相同的大小;論據:# '(1 2 3 4 5)'(ABC)

我試圖獲得(1 A 2 B 3 C 4 5)

+0

請澄清你的問題:陳述你正在做什麼,顯示你的代碼和你卡在哪裏,以及你想要實現什麼 – Soma

+0

我試圖交叉不同長度的列表。 Map函數只需要長度相同的列表,所以問題在於它們具有不同的長度。這就是我想要達到的目標:例如,如果你有兩個列表,如(1 2 3 4 5 6)(a b c),結果應該是(1 a 2 b 3 c 4 5 6)。或者如果你有(1 2 3)(a b c d e f),那麼(1 a 2 b 3 c d e f) – user3786933

+1

所以編輯你的問題;)並使用格式化工具來突出你的代碼。請參閱這裏的指導:http://stackoverflow.com/help/how-to-ask – Soma

回答

1

無論map也不fold-right會工作,因爲它們要麼信號當一個列表比另一個列表更小或者他們傾向於停在最短列表時出錯。例如。 SRFI-1map(interleave '(1 2 3 4) (circular-list 9 8)) ; ==> (1 9 2 8 3 9 4 8)。對於不同的行爲,你需要推出自己的行爲。

2
#lang racket 

(define (weave xs ys) 
    (match (list xs ys) 
    [(list (cons x xs) (cons y ys)) (cons x (cons y (weave xs ys)))] 
    [(list '() ys)     ys] 
    [(list xs '())     xs])) 
+1

既然在代碼中沒有任何評論,你可以請附上一些文字:)? –

+1

什麼不清楚? – soegaard

0

使用簡單的列表操作函數可能是一個解決辦法:

(define (interleave list1 list2) 
    (cond ((empty? list1) list2) 
     ((empty? list2) list1) 
     (else 
      (append 
      (list (car list1) (car list2)) 
      (interleave (cdr list1) (cdr list2)))))) 

測試...

> (interleave '(1 2 3 4 5) '(a b c)) 
(1 a 2 b 3 c 4 5) 
> (interleave '(1 2 3 4 5) '()) 
(1 2 3 4 5) 
> (interleave '() '(a b c)) 
(a b c) 
> 

我認爲這是相當自我記錄。

1

我假設你想要的行爲是列表交錯,只要這是可能的,然後從非空列表剩下的任何東西都附加到結尾。在這種情況下,一種可能的實施方式是

(define (interleave a b) 
    (if (null? a) 
     b 
     (cons (car a) 
      (interleave b (cdr a))))) 

我認爲這可能是編寫您要查找的最簡單的方法。

相關問題