簡體   English   中英

我需要在Scheme中合並兩個列表,每個列表取一個元素

[英]I need to merge two lists in Scheme, taking one element from each one

這是我寫的:

(: mmm : (Listof Any) (Listof Any) -> (Listof Any))
(define (mmm list1 list2)
  (cond [(or (null? list1) (null? list2)) null]
        (and (cons (first list1) (first list2)) (mmm (rest list1) (rest list2)))))

我舉一個例子:

list1:  a b c
list2:  1 2 3
answer: ((a 1) (b 2) (c 3))

編輯他們都一樣大小

如果允許使用map ,則可以使用:

(define (mmm lst1 lst2) (map (lambda (x y) (list x y)) lst1 lst2))

您的代碼有兩個問題:

  • 基本情況可能是正確的,也可能不是正確的-如果保證輸入列表的大小相同,就可以了。 如果它們的大小可以不同,請參閱@Sylwester的答案以獲取建議
  • 第二個條件應該以else開始(因為這是最后一個條件,並且條件是互斥的),而不是and
  • 您沒有正確構建輸出列表。 要添加新的元素是兩個輸入列表中的第一個元素的列表 ,而且必須是cons編調用遞歸的結果

要修復它們,請嘗試以下操作-假設輸入列表的長度相等:

(define (mmm list1 list2)
  (cond [(or (null? list1) (null? list2)) null]
        [else (cons (list (first list1) (first list2))
                    (mmm (rest list1) (rest list2)))]))

現在,該過程按預期工作:

(mmm '(a b c ) '(1 2 3))
=> '((a 1) (b 2) (c 3))

如果您知道列表的大小相同,那么它將變得簡單:

(define (mmm list1 list2) (map list list1 list2))

注意:如果這是您真正想要的,請用map cons替換map list 您的代碼使用了cons但是您的結果示例表明該list就是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM