Scheme - 访问列表中的数据对

时间:2015-02-03 16:38:01

标签: scheme racket

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

任何提示或建议都表示赞赏。谢谢!

编辑:我忘了提 - 我不允许使用递归或循环。

1 个答案:

答案 0 :(得分:1)

对于初学者,我认为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)))