0

最近授業で受けたテストであまり熱くしませんでした。しかし、他の誰もが同様にそれを爆撃したので、私たちの教授は、私たちがSchemeを知っていることを証明することによって、私たちにいくつかの「補う」ポイントを喜んで与えてくれます(それはあまり得意ではありません...)。しかし、彼女はテストの内容とは異なる質問をするでしょう。そのため、Scheme を使いこなすためにテストに出された問題に取り組んでいますが、次の問題がうまくいかないようです。

2 つのパラメータを取る Scheme 関数 reduce を書きます: f は単一のパラメータを取る関数で、x は任意の値です。reduce 関数は、x に含まれる入れ子になった各リストを使用して f を再帰的に呼び出し、元の入れ子になったリストを f の呼び出し結果に置き換えます。

たとえば、 (reduce (lambda(x) (cons 'list x)) '(3 7 9 zs (3 (78 2 3)))) を呼び出すと、次のように返されます。

'(リスト 3 7 9 zs (リスト 3 (リスト 78 2 3)))

また、 (reduce (lambda (x) (cdr x)) '(3 7 9 zs (3 (78 2 3)))) を呼び出すと、以下が返されます。

'(7 9 zs ((2 3))) で、ネストされた各リストから最初の要素が削除されます。

これは私が思いついたコードです:

(define reduce
  (lambda (f x)
    (if (null? x)'()
    (let ((var (car x)))
    (cond
      ((cons? var) (cons (f var) (reduce f (cdr x))))
      ((symbol? var) (cons var (reduce f (cdr x))))
      ((number? var) (cons var (reduce f (cdr x)))))))))

入力例を入力すると、次の結果が得られます。

(reduce (lambda(x) (cons 'list x)) '(3 7 9 zs (3 (78 2 3))))

(list 3 7 9 'z 's (list 'list 3 (list 78 2 3)))

誰がどこを知っているかから来ている余分な「リストがあります」

;

(reduce (lambda(x) (cdr x)) '(3 7 9 zs (3 (78 2 3))))

(list 3 7 9 'z 's (list (list 78 2 3)))

2 番目のネストされたループの 3 のみを削除します。最初の 3、中間の 3、3 番目の 78 を削除する必要があります。また、「リスト」という単語を含めるべきではありません

;

問題は ((cons? var) の行にあると想定していますが、修正方法がわかりません。

私たちは、Scheme 言語に深く入り込んでいないので、多くの特別なメソッドを学んでいません。それは主にすべて再帰です。

どんな助けでも大歓迎です。

ありがとう。

4

1 に答える 1

1

これが私の実装です:

(define (reduce f x)
  (define (inner x)
    (if (list? x)
        (f (map inner x))
        x))
  (inner x))

例:

> (reduce (lambda (x) `(list ,@x)) '(3 7 9 z s (3 (78 2 3))))
(list 3 7 9 z s (list 3 (list 78 2 3)))
> (reduce cdr '(3 7 9 z s (3 (78 2 3))))
(7 9 z s ((2 3)))

直接使用しないバージョンを次に示しますmapが、基本的に再実装mapします (ただし、ハードコードされたトランスフォーマーを使用します)。

(define (reduce f x)
  (define (transform lst)
    (if (null? lst)
        '()
        (cons (process (car lst)) (transform (cdr lst)))))
  (define (process x)
    (if (list? x)
        (f (transform x))
        x))
  (process x))
于 2013-11-13T21:28:17.743 に答える