0

この機能を実装する方法

2 つのリストを取得する場合 (abc)、(de)

リストを返す (a+d b+d c+d a+e b+e c+e)

リスト要素はすべて整数で、結果リストの要素順序は自由です

私はこのように試しました

(define (addlist L1 L2)
  (define l1 (length L1))
  (define l2 (length L2))
  (let ((result '()))
     (for ((i (in-range l1)))
        (for ((j (in-range l2)))
           (append result (list (+ (list-ref L1 i) (list-ref L2 j))))))))

しかし、結果が '() であるため、エラーが返されます

この問題の解き方がわかりません 助けてください

4

5 に答える 5

1

スキーム上、 set のような関数を使用することはお勧めしません! または追加!関数型プログラミング スタイルとしてではなく、データの変更または変数が発生するためです。

このようにする必要があります:

(define (add-one-list val lst)
  (if (null? lst) '()
    (cons (list val (car lst)) (add-one-list val (cdr lst)))))

(define (add-list lst0 lst1)
  (if (null? lst0) '()
    (append (add-one-list (car lst0) lst1)
            (追加リスト (cdr lst0) lst1))))

関数 add-one-list を最初に理解すると、再帰的に自分自身を呼び出し、val と lst の最初の要素をリストに作成するたびに、最終的な回答として CONS/accumulate します。

add-one-list と同様の add-list 関数。

于 2014-03-13T10:36:03.530 に答える
1
(define (addlist L1 L2)
 (flatmap (lambda (x) (map (lambda (y) (+ x y)) L1)) L2))

(define (flatmap f L)
 (if (null? L)
     '()
     (append (f (car L)) (flatmap f (cdr L))))) 

1 ]=> (addlist '(1 2 3) '(10 20))

;Value 2: (11 12 13 21 22 23)

これについては、ウィルとプロクラスと一緒に行きます。スキームを使用する場合は、慣用的なスキームを使用することもできます。

for を使用してリストを作成するのは、私には少し奇妙です。(リスト内包表記の方が適しています) For は通常、連続した副作用を誘発するために使用されます。それと RSR5 は for/list または for*/list を定義しません。

Flatmap はかなり一般的な関数パラダイムであり、cons の代わりに append を使用してリストを作成し、ネストされた空のサブリストを回避します。

于 2014-03-13T16:09:24.253 に答える