我需要在以下功能中编写加权和的计算程序:
((weighted-sum 1) 5)
5
((weighted-sum 1/2 1/2) 3 1)
2
等等..
到目前为止,我只做了如何获取程序的参数:
(define (weighted-sum x . xn) (cons x xs))
(weighted-sum 2 3)
> '(2 3)
如何获得((加权和2 3)X X)参数?
谢谢。
你的问题没有一个简单的答案。听起来你应该编写一个接受一系列权重的函数,然后返回一个接受一系列权重的函数,并对权重和总和的乘积求和(顺便说一句,说明你自己本来就是真有帮助...)。
1)这是你的设计还是其他人的设计?我不会这样设计这个功能。
2)您可以编写以多种不同方式返回函数的函数。例如。:
;; these all do the same thing.
;; they all have the type (number -> (number -> number))
(define a (lambda (x) (lambda (y) (+ x y))))
(define ((a x) y) (+ x y))
(define (a x)
(define (b y) (+ x y))
b)
因此,weighted-sum
将可变数量的值作为参数(让我们称之为ws
),并返回一个新程序,然后采用可变数量的参数(vs
)并进行计算。在球拍中,for/fold
构造派上用场:
(define (weighted-sum . ws)
(lambda vs
(for/fold ((res 0)) ((i (in-list ws))
(j (in-list vs)))
(+ res (* i j)))))
甚至
(define ((weighted-sum . ws) . vs)
(for/fold ((res 0)) ((i (in-list ws))
(j (in-list vs)))
(+ res (* i j))))
或者,使用更经典的foldl
返回一个命名的内部过程:
(define (weighted-sum . ws)
(define (sub . vs)
(foldl
(lambda (i j res) (+ res (* i j)))
0
ws
vs))
sub)
对于任何这些:
> ((weighted-sum 1) 5)
5
> ((weighted-sum 1/2 1/2) 3 1)
2