Итак, вы хотите написать функцию, которая
(sums (list)) = (list 0) ;; Your implementation has this right
(sums (list x)) = (list 0 x) = (list 0 (+ x 0))
(sums (list y x)) = (list 0 y (+ y x)) = (list 0 (+ y 0) (+ y (+ x 0)))
(sums (list z y x)) = (list 0 z (+ z y) (+ z y x)) = (list 0 (+ z 0) (+ z (+ y 0)) (+ z (+ y (+ x 0))))
и так далее (здесь я использую очень наводящие на размышления имена, скобки и макет, вы поймете, почему).
Обратите внимание, что все списки результатов начинаются с 0
, а остальное совпадает с результатом из предыдущей строки, за исключением того, что первый входной элемент добавляется к каждому последующему элементу.
Другими словами, мы имеем
(sums (car x items)) = (cons 0 (add-to-each x (sums items)))
Итак, сначала вам нужно реализовать
(: add-to-each : Integer -> (Listof Integer))
(define (add-to-each x items)
...)
а затем использовать это в реализации sums
. Чтобы реализовать add-to-each
, нам нужно заметить, что
(add-to-each x ()) = ()
(add-to-each x (cons y1 ())) = (cons (+ x y1) ())
(add-to-each x (cons y2 (cons y1 ())) = (cons (+ x y2) (cons (+ x y1) ()))
и так далее.
Поскольку вы говорите, что делаете это, чтобы выучить Racket, я остановлюсь здесь и посмотрю, сможете ли вы понять это отсюда.
person
Cactus
schedule
16.11.2016
(append (list 0) ..)
используйте(cons 0 ...)
. - person Cactus   schedule 16.11.2016(sums (cons a b))
, выражениеappend
не действует. (и, кстати,(append (list a) (list b) (list c))
совпадает с(list a b c)
.) - person Will Ness   schedule 16.11.2016scanl
). - person Will Ness   schedule 16.11.2016