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)))。看起来不错。谢谢,我跑得更快了。“第二种解决办法对我来说更好。”真理是在辩论中产生的,是关于谚语的。