Scheme 方案-如何聚合列表?

Scheme 方案-如何聚合列表?,scheme,Scheme,我有一个城市的名单,我想得到居民的名单。以下是一份清单: ((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

我有一个城市的名单,我想得到居民的名单。以下是一份清单:

((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)

最小值应该是40000。问题是
中的
0
((null?lst)0)
,但我不知道如何重写代码。你知道吗?谢谢。

当然,0和40000的最小值是0。请参见,您正在使用0作为聚合内的默认值。要么将其更改为100亿(然后您的
(聚合最大值…
将不起作用);或者更改
aggregate
函数以接受另一个参数,即默认值

像这样:

(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)))))
也许不是。请注意,您正在列表上“减少”一个二进制函数。只有当列表不是空的时候,它才有意义。所以这里根本不需要默认值——使用任何值实际上都是错误的。相反,当列表中只剩下一个元素时停止:

(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
产生的内容,at也必须接受为其第二个参数。因此,在第二个变量(也称为
foldr1
)中,它必须接受两个相同类型(类型)的参数,并生成相同类型的结果,即
proc
(a->a->a)
类型的函数。但总的来说,它可能是不同的,一种类型的
(a->b->b)
,在这种情况下,只有第1种变体(又称foldr)可以工作。

我很确定巴黎有超过40000居民:)居住者-有多少人住在那里。(定义(居住者x)(第三个x))。它给了我列表中的每三个元素。@larsmans,可能是19世纪的数据。我知道这只是一个例子。注意:(定义居住者第三)更简单,而且经常被忽略——一流函数的奇迹……已经完成了。我将((null?lst)0重写为((null?(cdrlst))(n(carlst)))。看起来不错。谢谢,我跑得更快了。“第二种解决办法对我来说更好。”真理是在辩论中产生的,是关于谚语的。