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