Lisp求平方根
程序员文章站
2022-04-02 11:53:07
...
Square root algorithm of Heron of Alexandria
为了找到x的平方根:
1.做出猜测guess
2.用guess和x/guess的平均数代替guess,提高精度
3.持续提高guess的精度直到满足精度要求
4.用1作为初始guess
//求绝对值
(defun my-abs (x)
(cond ((< x 0) (- x))
((= x 0) 0)
((> x 0) x)))
//计算平均数
(defun my-average (x y)
(/ (+ x y) 2))
//计算guess和x/guess的平均数
(defun my-improve (guess x)
(my-average guess (/ x guess)))
//判断是否满足精度要求,此处精度为0.001
(defun good-enough? (guess x)
(< (my-abs (- (* guess guess) x)) 0.001))
//不断提高guess的精度直到满足要求
(defun my-try (guess x)
(if (good-enough? guess x)
guess
(my-try (my-improve guess x) x)))
//用初始值1来进行guess
(defun my-sqrt (x)
(my-try 1 x))
1.为了体会算法,我特意将每个函数都做成了自己的版本
2.每个函数都是基于它上面函数的定义
以下是在lispbox-0.7中运行的结果:
可以看到输出的结果都是符合精度的
不过Lisp并不适合用来作为科学计算的语言,这里我只是想来具体实践一下
参考:
《Structure and Interpretation of Computer Programs》
《ANSI Common Lisp》
MIT课程6.001
上一篇: Java简单模拟ATM