练习22.5.11 开发一个函数multiply-all,它接收一个数字列表并返回将它们相乘的结果。
例如:
(check-expect (multiply-all (cons 3 (cons 5 (cons 4 empty)))) 60)
提示:空列表的“正确答案”是什么?它可能不是你第一次想到的!
解决方案:数据定义类似于字符串列表的数据:
; 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
...)
|#
有什么建议吗?
答案 0 :(得分:0)
对于最简单的解决方案,请使用apply
:
(define (multiply-all lst)
(apply * lst))
如果您需要从头开始构建过程,请记住基本案例(空列表)应返回1
,递归步骤应使用标准解决方案模板乘以当前值,如下所示:
(define (multiply-all lst)
(if (empty? lst)
1
(* (first lst)
(multiply-all (rest lst)))))
为了获得更好的答案,您可以尝试使用尾递归:
(define (multiply-all lst)
(let loop ([lst lst] [acc 1])
(if (empty? lst)
acc
(loop (rest lst) (* (first lst) acc)))))
无论如何,程序按预期工作:
(multiply-all '())
=> 1
(multiply-all '(3 5 4))
=> 60