1

都市のリストがあり、居住者の分を取得したい。これはリストです:

((London United-Kingdom 100000)
 (Paris France 40000)
 (Sydney Australia 350000)
 (New-York USA 1200000))

私のコードは次のとおりです。

(define (aggregate proc n lst)
  (cond ((null? lst) 0)
        ((proc (n (car lst)) (aggregate proc n (cdr lst))))
        (else (aggregate proc n (cdr lst)))))

(aggregate max habitants cities) --> 1200000
(aggregate min habitants cities) --> 0 (should be 40000)

Min は 40000 のはずです。問題は0((null? lst) 0)ありますが、コードを書き直す方法がわかりません。何か考えはありますか?ありがとう。

4

1 に答える 1

2

当然、0 と 40000 の最小値は 0 ですaggregate。それを 100 億に変更します ((aggregate max ...)そうすれば機能しなくなります)。または、aggregateもう 1 つの引数 (既定値) を受け入れるように関数を変更します。

このような:

(define (aggregate proc n lst def)
  (cond ((null? (cdr lst)) def)
        ((proc (n (car lst)) (aggregate proc n (cdr lst))))
        (else (aggregate proc n (cdr lst)))))

またはそうでないかもしれません。リストに対して二項関数を「縮小」していることに注意してください。リストが空でない場合にのみ意味があります。したがって、ここではデフォルト値はまったく必要ありません。使用するのは実際には間違っています。代わりに、リストに要素が 1 つしか残っていないときに停止します。

(define (aggregate proc n lst)
  (cond ((null? (cdr lst)) (n (car lst)))
        ((proc (n (car lst)) (aggregate proc n (cdr lst))))
        (else (aggregate proc n (cdr lst)))))

どちらかを選んでください。結合関数procが生成するものは、その 2 番目の引数としても受け入れなければならないことに注意してください。したがって、2 番目のバリアント (aka foldr1) では、同じ種類 (型) の 2 つの引数を受け入れ、同じ型の結果を生成する必要があります。つまりproc、 type の関数です(a -> a -> a)。しかし、一般的には、タイプが異なる場合があり(a -> b -> b)、その場合、最初のバリアント (aka foldr) のみが機能します。

于 2013-03-10T10:46:42.373 に答える