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

问题描述 投票:1回答:2

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

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

谢谢。

racket
2个回答
0
投票

你的问题没有一个简单的答案。听起来你应该编写一个接受一系列权重的函数,然后返回一个接受一系列权重的函数,并对权重和总和的乘积求和(顺便说一句,说明你自己本来就是真有帮助...)。

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)

0
投票

因此,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
© www.soinside.com 2019 - 2024. All rights reserved.