Ракетка - реализация функций взвешенной суммы - PullRequest
0 голосов
/ 10 января 2020

Мне нужно реализовать функцию, которая будет показывать #f как результат, если списки ws и vs имеют разное количество аргументов.

код:

(define (weighted-sum . ws)
  (define (sub . vs)
    (foldl
     (lambda (i j res) (+ res (* i j)))
     0
     ws
     vs))
  sub)

для честно говоря, я понятия не имею, нужно даже начать

1 Ответ

0 голосов
/ 10 января 2020

Просто добавьте and с условием, согласно которому длины обоих списков должны быть одинаковыми.

#lang racket

(define (weighted-sum . ws)
  (define (sub . vs)
    (and (= (length ws) (length vs)) ; <- ADDED
         (foldl (lambda (i j res) (+ res (* i j))) 0 ws vs)))                    
  sub)


; TESTS
(module+ test
  (require rackunit)

  (check-equal? ((weighted-sum)) 0)
  (check-equal?  ((weighted-sum 1 2 3 4) 10 20 30 40) 300)
  (check-equal? ((weighted-sum 1 2 3 4) 10 20 30) #f)
  (check-equal? ((weighted-sum 1 2) 10 20 30) #f))

Редактировать:

Здесь я связываю результат в let, а затем просто проверяю, равен ли он 1. Если это так, and приведет к result, иначе это приведет к #f.

(define (weighted-sum . ws)
  (define (sub . vs)
    (and (= (length ws) (length vs))
         (let ([result (foldl (lambda (i j res) (+ res (* i j))) 0 ws vs)])
           (and (= result 1) result))))                    
  sub)

Примечание: (if <some-condition> <then-expr> #false) эквивалентно (and <some-condition> <then-expr>)

...