0

これには少し問題があります。基本的に、comb2 つのリストを受け取って(comb '(a b c) '(1 2 3)を返すプロシージャが必要('a 1)('b 2)('c 3)です。最初のペアを返すタラの一部を思いついた

(define some-letters '(a b c))
(define some-nums '(1 2 3))
(define x (first (foldr cons empty some-letters)))
(define y (first (foldr cons empty some-nums)))
(define (comb list1 list2)
  (cond
   [(empty? list1) empty]
   [(empty? list2) empty]
    [else (list x y)]))

combここで、もう少しいじくり回して、少し異なる定義を思いつきました。

(define (comb list1 list2)
  (cond
   [(empty? list1) empty]
   [(empty? list2) empty]
    [else ((list x y) (zip (rest list1) (rest list2)))]))

しかし、これは以下を返します:

function call: expected a function after the open parenthesis, but received (list 'a 1)

ご協力いただければ幸いです。

4

2 に答える 2

2

実装には 2 つの問題があります。

  • cons作成中の出力リストの現在の要素を忘れました
  • (この関数は通常 として知られていますが)combではなく、関数に名前を付けたため、再帰呼び出しを実行するときに使用する必要があります。zipzipcomb

これにより、問題が修正されます。

(define (comb list1 list2)
  (cond
    [(empty? list1) empty]
    [(empty? list2) empty]
    [else (cons (list (first list1) (first list2))
                (comb (rest list1) (rest list2)))]))

または、同じ長さのリストに対してのみ機能するという警告を使用して、さらに単純な実装でこれを試してください。

(define (comb list1 list2)
  (map list list1 list2))
于 2013-11-12T03:03:57.717 に答える
0

これを試して:

(defvar lst1 '(abcdef))

(defvar lst2 '(1 2 3 4 5))

リストの長さが異なることに注意してください。

(defun 2list (xy)

(リスト xy))

注 2list は、それらを組み合わせてリストにする 2 つの引数の関数です。

(defun コーム (lstA lstB)

(mapcar #'2list lstA lstB))

これは ((A 1) (B 2) (C 3) (D 4) (E 5)) を返すはずです。

関数 2list は、いくつかの場所で使用する予定がない限り、無名関数 (ラムダ) が適しているタイプです。

于 2013-11-16T22:49:12.583 に答える