如何在RACKET中进行乘法 - 全部函数

时间:2014-03-18 12:48:12

标签: scheme racket multiplication

练习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
...)
|#

有什么建议吗?

1 个答案:

答案 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