我是Scheme的新手(使用Dr. Racket),这是一项家庭作业,所以请不要直接回答。我一直试图在网上找到一个解决方案,但没有找到一个令人满意的解决方案。
我正在编写一个过程,它将采用一个参数 - 一对列表。然后我需要使用abs找到每对两个数字之间的差异,然后将所有对的差异加起来。
我的代码如下。
(define example2 '((2 -7) (-4 -20) (7 7) (-13 2)))
(define get-difference
(lambda (lyst)
(apply plus (abs(list-ref lyst 0)) (abs(list-ref lyst 1)))))
(define total-error
(lambda list-of-pairs
(apply plus (map get-difference list-of-pairs))))
我遇到两件事(我认为)有问题: 通过整个列表访问每对数据 对列表中的每一对使用abs。
如果我传两个数字,我可以使用get-difference,
(define get-difference
(lambda (x y)
(+ (abs x) (abs y))))
但我试图将列表传递给它。从另一个作业,我使用了一个get-num函数,它运行正常 - 但是,这种方法似乎不适用于我的问题:
(define get-num
(lambda (lyst)
(list-ref lyst 1)))
(define average-grade
(lambda (list-of-grades)
(/ (apply plus (map get-num list-of-grades)) (length list-of-grades))))
任何提示或建议都表示赞赏。谢谢!
编辑:我忘了提 - 我不允许使用递归或循环。答案 0 :(得分:1)
对于初学者,我认为get-difference
函数定义不正确。不应该这样吗?
(define get-difference
(lambda (x y)
(abs (- x y))))
回到主要问题。你走在正确的轨道上,使用apply
,map
,list-ref
会有效,但你却以错误的方式组合它们。试试这个:
(define total-error
(lambda (list-of-pairs)
(apply + (map (lambda (pair) ; each element in the list is a pair
(get-difference (list-ref pair 0)
(list-ref pair 1)))
list-of-pairs))))
或者,我们可以使用foldl
在一个步骤中执行差异然后添加:
(define total-error
(lambda (list-of-pairs)
(foldl (lambda (pair sum)
(+ (get-difference (list-ref pair 0)
(list-ref pair 1))
sum))
0
list-of-pairs)))