4

2つのリストを1つのリストにマージする関数を設計する方法。最初のリストの最初の要素は新しいリストの最初の要素になり、2番目のリストの最初の要素は新しいリストの2番目の要素になります(a、b、c、d、e、f)(g、h、 i)は(a、g、b、h、c、i、d、e、f、)になります

4

4 に答える 4

13

これは、純粋関数型で再帰的な実装です。R6RS

(define (merge l1 l2)
      (if (null? l1) l2
          (if (null? l2) l1
              (cons (car l1) (cons (car l2) (merge (cdr l1) (cdr l2)))))))
于 2012-09-28T20:32:16.090 に答える
8

実装しようとしているプロシージャは、interleaveまたはとして知られていmergeます。これは宿題のように見えるので、私はあなたに正直な答えを残すことはできません。代わりに、私はあなたを正しい方向に向けます。空欄に記入してください:

(define (interleave lst1 lst2)
  (cond ((null? lst1)     ; If the first list is empty
         <???>)           ; ... return the second list.
        ((null? lst2)     ; If the second list is empty
         <???>)           ; ... return the first list.
        (else             ; If both lists are non-empty
         (cons (car lst1) ; ... cons the first element of the first list
               <???>))))  ; ... make a recursively call, advancing over the first
                          ; ... list, inverting the order used to pass the lists.
于 2012-09-28T20:33:06.943 に答える
1

両方のリストを確認する必要はありません。簡単なバージョンは次のとおりです。

    (define (interleave lx lz)
  (cond
    [(empty? lx) lz]
    [else (cons (first lx)(interleave lz (rest lx)))]))


(check-expect(interleave '() '())'())
(check-expect(interleave '(X X X X X X) '(O O O O O))
             (list 'X 'O 'X 'O 'X 'O 'X 'O 'X 'O 'X))
(check-expect(interleave '(1 2 3) '(a b c d e f))
             (list 1 'a 2 'b 3 'c 'd 'e 'f))
于 2016-04-29T20:43:18.233 に答える
0

これは、単純な条件を使用して実行できます。

(define (merge a b)
  (cond ((null? a) b)
        ((null? b) a)
        (else (cons (car a) (merge b (cdr a))))
        ))
于 2020-10-18T18:55:59.037 に答える