http://erdos.csie.ncnu.edu.tw/~klim/scheme/lisp-1062.htmlexercise 5: calculating continued-fraction
•Refer to exercise 1.37.(參考這篇:黃金分割)
•You have to write two procedures. One is (cont-frac n d k) and another is (pi epsilon).
•The "cont-frac" should be implemented in linear iterative way.
•To calculate pi, the sequence N_i is: 4, 1^2, 2^2, 3^2, ...
and the sequence D_i is: 1, 3, 5, 7, ...
•To approximate pi, calculate (cont-frac n d 1), (cont-fract n d 2), .. until two consecutive values
are close enough, that is, the distance between them is less than epsilon.
$ scheme48
> ,load ex5.scm
> (cont-frac (lambda (i) 1.0) (lambda (i) 1.0) 100)
0.6180339887498948
> (pi 0.001)
3.141463414634146
> (pi 0.0001)
3.1415888250921244
> (pi 0.0000000000001)
3.141592653589791
> ,exit
$
解答說明請參考:【Scheme】連分法求pi
解答:
;continued fraction calc pi
(define (cont-frac n d k)
(define (frac-iter i result)
(if (= i 0)
result
(frac-iter (- i 1.0) (/ (n i) (+ (d i) result)))))
(frac-iter (- k 1.0) (/ (n k) (d k))))
(define (calc-pi k)
(define (d i)
(- (* 2 i) 1))
(define (n i)
(if (= i 1)
4
(* (- i 1) (- i 1))))
(cont-frac n d k))
(define (calc-enough index accuracy)
(define next_i index) ;next_i=index
(if (< (abs (- (calc-pi index) (calc-pi (+ next_i 1)))) accuracy)
(calc-pi (+ next_i 1)) ;true
(calc-enough (+ index 1) accuracy))) ;false
(define (pi accuracy)
(calc-enough 1 accuracy))
執行結果: