1

私が受けている模擬試験では、リストを取得し、順序を維持しながら古いリストの各要素を 2 つ含む新しいリストを作成する手順を作成するよう求める問題があります。彼らが提供する例:

    (double-duplicate (list 1 2 3 4 4 5))

生産する

    (1 1 2 2 3 3 4 4 4 4 5 5)

map と flatten を使用するソリューションを見つけることができました:

    (define (flatten list)
       (cond ((null? list) '())
             ((list? (car list)) (append (flatten (car list)) (flatten (cdr list))))
             (else (cons (car list) (flatten (cdr list))))))

    (define (double-duplicate ls)
      (define (helper list1 list2)
        (flatten (map list list1 list2)))
      (helper ls ls))

それは機能しますが、3つのパラメーターを取るマップの形式を使用しているため、それが最も効果的なソリューションであるとは感じません。余分な括弧。誰でもこれを行うためのより良い方法を考えることができますか? 他にどのように書けばよいのか、少し迷っています。アイデアをいただければ幸いです。

*注: このすべてに MIT スキームを使用しています。

4

2 に答える 2

2

これは次の場合により適していaccumulateます。

(define (double-duplicate lst)
  (accumulate (lambda (e acc)
                (cons e (cons e acc)))
              '()
              lst))

繰り返しますが、それが前の質問のように定義されていると仮定しaccumulateます-つまり、右への折り畳みとして。

于 2012-11-18T18:28:16.590 に答える
1

ラケットを使っていますか?その場合は、次を使用できますappend-map

(define (double-duplicate lst)
  (append-map (lambda (x) (list x x)) lst))

append-mapScala の などに似ていflatmapます。

append-map次のことが必要な場合は、独自のバージョンを作成するのは難しくありません。

(define (append-map func lst)
  (fold-right (lambda (e r)
                (append (func e) r)) '() lst))
于 2012-11-18T18:27:18.970 に答える