[racket] Puzzled with tail-recursion conversion

From: namekuseijin (namekuseijin at gmail.com)
Date: Wed Feb 15 16:26:56 EST 2012

thanks.  Very subtle difference... definitely not a good idea to try
to double an existing variable as an accumulator too...

I reworked it to:

(define (pi4 accuracy)
  (let helper ((k 0) (r 0))
    (let ((this (* (/ (expt -1 k) (expt 4 k))
                   (+ (/ 2 (+ (* 4 k) 1))
                      (/ 2 (+ (* 4 k) 2))
                      (/ 1 (+ (* 4 k) 3))))))
      (if (< (abs this) accuracy)
          (+ this r)
          (helper (+ k 1) (+ this r))))))

and just to clear up, this is not someone else's pi... :p

On Wed, Feb 15, 2012 at 5:02 PM, Matthias Felleisen
<matthias at ccs.neu.edu> wrote:
>
> If you systematically apply cps and then accumulator transformations, you get this:
>
> (define (pi3 accuracy)
>  (let helper ((k 0))
>    (let ((this (formula k)))
>      (if (< (abs this) accuracy)
>          this
>          (+ this (helper (+ k 1)))))))
>
> (pi3 .1)
>
> (define (pi3-cps accuracy)
>  (let helper ((k 0) (c (lambda (x) x)))
>    (let ((this (formula k)))
>      (if (< (abs this) accuracy)
>          (c this)
>          (helper (+ k 1) (lambda (v) (c (+ this v))))))))
>
> (pi3-cps .1)
>
> (define (pi3-accu accuracy)
>  (let helper ((k 0) (c 0))
>    (let ((this (formula k)))
>      (if (< (abs this) accuracy)
>          (+ c this)
>          (helper (+ k 1) (+ c this))))))
>
> (pi3-accu .1)
>
> Now when you compare the result of that with yours:
>
> (define (pi4 accuracy)
>  (let helper ((k 1) (this (formula 0)))
>    (if (< (abs this) accuracy)
>        this
>        (helper (+ k 1) (+ this (formula k))))))
>
> you immediately see why yours fails.
>
> ;; ---
>
> I would worry about accuracy because you are switching the direction of addition when you apply the accu transform, but perhaps you know why this doesn't matter for your context.
>


Posted on the users mailing list.