方案-访问列表中的数据对
Scheme - Access Data Pairs in List
我是 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))))
如有任何提示或建议,我们将不胜感激。谢谢!
编辑:我忘了说 - 我不允许使用递归或循环。
首先,我认为 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)))
我是 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))))
如有任何提示或建议,我们将不胜感激。谢谢!
编辑:我忘了说 - 我不允许使用递归或循环。
首先,我认为 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)))