方案-访问列表中的数据对

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

回到正题。您走在正确的轨道上,使用 applymaplist-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)))