问题
Exercise 22.5.11 Develop a function multiply-all that takes in a list of numbers and returns the result of multiplying them all together.
For example:
(check-expect (multiply-all (cons 3 (cons 5 (cons 4 empty)))) 60)
Hint: What is the “right answer” for the empty list? It may not be what you think at first!
Solution: The data definition is similar to that for list-of-strings:
; A list-of-numbers is either
; empty or
; a nelon (non-empty list of numbers).
#|
(define (function-on-lon L)
; L a list of numbers
(cond [ (empty? L) ...]
[ (cons? L) (function-on-nelon L)]
))
|#
; A nelon looks like
; (cons number lon )
#|
(define (function-on-nelon L)
; L a cons
; (first L) a number
; (rest L) a lon
; (function-on-lon (rest L)) whatever this returns
...)
|#
Any suggestions?
回答1:
For the simplest solution, use apply
for this:
(define (multiply-all lst)
(apply * lst))
If you need to build the procedure from scratch, just remember that the base case (an empty list) should return 1
, and the recursive step should multiply the current value using the standard solution template, like this:
(define (multiply-all lst)
(if (empty? lst)
1
(* (first lst)
(multiply-all (rest lst)))))
For a nicer answer, you can try using tail recursion:
(define (multiply-all lst)
(let loop ([lst lst] [acc 1])
(if (empty? lst)
acc
(loop (rest lst) (* (first lst) acc)))))
Anyway the procedures work as expected:
(multiply-all '())
=> 1
(multiply-all '(3 5 4))
=> 60
来源:https://stackoverflow.com/questions/22479897/how-to-do-multiply-all-function-in-racket