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中运行的结果:
可以看到输出的结果都是符合精度的
参考:
《Structure and Interpretation of Computer Programs》
《ANSI Common Lisp》
MIT课程6.001