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