(define double
    (lambda (x)
      (* 2 x)))

(define halve
    (lambda (x)
      (/ x 2)))


(define f-product
    (lambda (a b)
      (cond [(= a 0) 0]
        [(= a 1) b]
        [(even? a) (f-product (halve a) (double b))]
        [else (+ b (f-product (- a 1) b))])))


(define f-fproduct
    (lambda (a b)
      (define f-i
        (lambda (a b base)
          (cond [(= a 0) 0]
            [(= a 1) (+ b base)]
            [(even? a) (f-i (halve a) (double b) base)]
            [else (f-i (- a 1) b (+ base b))])))
      (f-i a b 0)))

 

Posted on 2013-02-23 17:06  ASOCS  阅读(156)  评论(0编辑  收藏  举报