我需要编写以下功能计算加权和的程序:
((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 )参数?
谢谢。
答案 0 :(得分:0)
您的问题没有一个简单的答案。听起来你应该编写一个接受一系列权重的函数,然后返回一个接受一系列权重的函数,并对权重和总和的乘积求和(顺便说一句,说明你自己本来就是真有帮助......)。
1)这是你的设计还是别人的设计?我不会这样设计这个功能。
2)您可以编写以多种不同方式返回函数的函数。 E.g:
;; 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)
答案 1 :(得分:0)
因此weighted-sum
将可变数量的值作为参数(让我们称之为ws
),并返回一个新的过程,而这些过程又采用可变数量的参数({{1} })并进行计算。
在球拍中,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)