0

夜!

Pythonの組み込みのreduce関数と同じように機能するreduce関数を Scheme で作成する必要があります。スキームで reduce 関数を書くのは簡単です:

(define (reduce fn lis identity)
  (if (null? lis)
    identity
    (fn (car lis)
        (reduce fn (cdr lis) identity))))

ただし、このコードは Python のreduceと同じではありません。Python の reduceは 2 つの引数 (関数と reduce するアイテムのリスト) しか取りません。

このように動作するScheme関数を書くのを手伝ってくれる人はいますか?

(>(reduce * '(2 4 5 5)) => 200、教授の例です。)

どうもありがとう、男と女。あなたはとても役に立ちます <3

ETA: Levien 氏と Jester-Young 氏、どうもありがとうございました。自分で問題を解決するのに役立つ完璧な量の情報を提供してくれました。*抱擁

4

3 に答える 3

5

それは簡単だ。アキュムレータは、リストの最初の要素で初期化されます。

(define (py-reduce f ls) (fold f (car ls) (cdr ls)))

(py-reduce * '(2 4 5 5)) => 200

srfi-1 からの折りたたみ以外の別の reduce 関数 (reduce、fold-right ... など) を自由に使用するか、独自のものを使用してください。リストには少なくとも 1 つの要素が必要です。

于 2011-02-24T09:32:55.670 に答える
2

ID を持つと、関数はサイズが 0 以上のリストを処理できます。空のリストの場合は、ID を取得します。ID がない場合、関数は 1 つ以上の要素のリストでのみ機能します。一部の関数は、自然に ID を持ちます (加算の場合は 0、乗算の場合は 1 など)。他のものはそうではありません -min特にmax、特に big int ではそうです。

あなたは残りを理解できるはずです:)

于 2011-02-24T04:21:00.980 に答える
0

以下は末尾再帰バージョンです。あなたの教授はおそらくそれを好まないでしょう (再帰を示していないので ;-)) が、少なくともそれをどのように行うかについてのアイデアを与えるでしょう.

(define (reduce func lst)
  (let loop ((val (car lst))
             (lst (cdr lst)))
    (if (null? lst) val
        (loop (func val (car lst)) (cdr lst)))))

Raph Levien の優れた回答で示唆されているように、着信リストが空の場合、このバージョンは機能しません (それがidentityパラメーターの目的です)。この場合、エラーが発生します (できないcarcdr空のリストであるため)。

于 2011-02-24T04:34:36.573 に答える