如何设计一个从给定列表中的每个数字中减去 2 的函数?

How to design a function that subtracts 2 from each number in a given list?

这是我的代码。我的测试结果总是错误的,我不知道错误在哪里,如何改正。

(define (calculator op num lst)
  (cond [(empty? lst) empty]
        [else (cons (op num (first lst))
                    (calculator op num (rest lst)))]))

(define (sb lst)
  (calculator - 2 lst))
(define (calculator op num lst)
; test result:
(sb (list 2 3))
-->(list 0 -1)

(sb (list 5 6))
-->(list -3 -4)

(sb (list -1 -2))
-->(list 3 4)

问题是由 (op num (first lst)) 引起的。当你 运行 你的代码时,它本质上等同于 (- 2 (first lst))。您没有从列表中的每个项目中减去 2。相反,您要从 2 中减去列表中的每个项目。您正在执行 2 - x 而不是 x - 2。要获得所需的结果,应翻转给 - 的参数。

您可以通过定义一个以不同顺序接受其参数的“翻转减法”函数来解决该问题。例如:

(define (flipped-sub b a)
  (- a b))

(define (sb lst)
  (calculator flipped-sub 2 lst))

或者只使用匿名 lambda:

(define (sb lst)
  (calculator (lambda (num x) (- x num)) 2 lst))