本文主要是介绍sicp每日一题[1.38],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Exercise 1.38
In 1737, the Swiss mathematician Leonhard Euler published a memoir D e F r a c t i o n i b u s C o n t i n u i s De\ Fractionibus\ Continuis De Fractionibus Continuis, which included a continued fraction expansion for e − 2 e − 2 e−2, where e e e is the base of the natural logarithms. In this fraction, the N i N_i Ni are all 1, and the D i D_i Di are successively 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, . . … Write a program that uses your cont-frac procedure from Exercise 1.37 to approximate e e e, based on Euler’s expansion.
这道题本来很简单,只要实现 D i D_i Di就可以了,但是当我使用 1.37 的程序时,却发现算出的结果跟 e e e 有很大差距,最后把 1.37 的程序也做了修改才得到满意的近似值。
首先是去掉了寻找满足条件的最小 k k k值的部分,另外迭代和递归实现也都做了一定的调整。
; 注意 n 和 d 都是 procedure 而不是数字,k 表示要计算的项数
(define (cont-frac n d k); iterative implementation(define (frac-iter k pre)(if (= k 0)pre(frac-iter (- k 1) (/ (n k) (+ (d k) pre))))); recurative implementation(define (frac-recur i)(if (= i k)(/ (n i) (d i))(/ (n i) (+ (d i) (frac-recur (+ i 1))))))(frac-iter k 0));(frac-recur 1))(define (e-euler k)(+ 2.0 (cont-frac (lambda (i) 1); 观察 Di 序列,发现每 3 个一组,; 从 1 开始计数的话,在每一组的 3 个数中,只有除以 3 余数为 2 的那个不是 1(lambda (i) (if (= (remainder i 3) 2) (/ (+ i 1) 1.5) ; 先除3向下取整再加1最后乘2,等同于先加1再除1.51)) k))) ; e 的近似值为 2.71828
(e-euler 100); 输出结果为
2.7182818284590455
这篇关于sicp每日一题[1.38]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!