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

Scheme 如何设计一个从给定列表中的每个数字中减去2的函数?,scheme,racket,Scheme,Racket,这是我的密码。我的测试结果总是错误的,我不知道错误在哪里,也不知道如何改正 (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 (calc

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

(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)
;测试结果:
(sb(名单2-3))
-->(列表0-1)
(sb(名单5和6))
-->(名单-3-4)
(sb(名单-1-2))
-->(清单3-4)

问题是由
(op num(first lst))
引起的。当您运行代码时,它实际上相当于
(-2(第一个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))

我想,也许我应该把lst放在2前面,把我的抽象函数改成计算器。否则,它是2减去列表项,而不是-2项
(define(sb-lst)(map(lambda(n)(-n2))lst))
?这是否回答了您的问题?当您可以通过更改来解决问题时,为什么要为此编写一个辅助函数:
(op num(first lst))
-->(op num(first lst))在
计算器
的定义中?@adabsurdum我假设op想要
计算器
函数来处理各种计算(不仅仅是减法)。如果OP希望使用
计算器
定义
除法列表(
(/list item num)
)和
除法列表(
(/num list item)
),那么您建议的更改将是任意的。