球拍 - 程序的争论如何获得所有

时间:2017-12-24 16:46:47

标签: racket

我需要编写以下功能计算加权和的程序:

((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 )参数?

谢谢。

2 个答案:

答案 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)