retweet

第一个Lisp练习程序

今天尝试抄了SICP上的sqrt实现, 作为第一个练习程序.
(define (sqrt x)  

(define (goodguess? y )
(< (abs(- (* y y) x)) 0.001)
)
(define (sqrt-itor guess )
(if (goodguess? guess )
guess
(sqrt-itor (improve guess ) )))
(define (improve guess )
(average guess (/ x guess)))
(define (average a b)
(/ (+ a b) 2))

(sqrt-itor 1.0 ))
在scheme48里面尝试:
> ,load-script sqrt.lisp
> (sqrt 2)
1.4142156862745097
有趣的是, 上面的(sqrt-itor 1.0 )改成(sqrt-itor 1 ), 数值计算的整个过程就全是用*整数*和*分数*来实现了. 没错, scheme48支持*分数*的数据类型:
> ,load-script sqrt.lisp
> (sqrt 2)
577/408

> (/ 1 100)
1/100
> (/ 3 7)
3/7
我现在把(< (abs(- (* y y) x)) 0.001) 改成(< (abs(- (* y y) x)) 0.0000000000001)
> ,load-script sqrt.lisp
> (sqrt 2)
886731088897/627013566048
> (sqrt 3)
708158977/408855776
> (sqrt 5)
23725150497407/10610209857723
有趣吧? PS: 这次真的开始学习Lisp了 . 我是受<Lisp的本质>这篇文章影响.
--EOF--

若无特别说明,本站文章均为原创,转载请保留链接,谢谢

本文地址: http://www.dulao5.com/sicp/2011/03/04/Lisp-Exercise1.textile