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)

最小值应为 40000。问题0出在 中((null? lst) 0),但我不知道如何重写我的代码。你有什么主意吗?谢谢。

4

1 回答 1

2

自然,0 和 40000 的最小值是 0。看,你使用 0 作为里面的默认值aggregate。要么将其更改为 100 亿(然后您(aggregate max ...)将无法工作);或更改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)))))

或者可能不是。请注意,您正在“减少”列表上的二进制函数。只有当列表不为空时才有意义。所以这里根本不需要默认值——使用 any 实际上是错误的。相反,当列表中只剩下一个元素时停止:

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

于 2013-03-10T10:46:42.373 回答