欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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求平方根
可以看到输出的结果都是符合精度的
不过Lisp并不适合用来作为科学计算的语言,这里我只是想来具体实践一下

参考:
《Structure and Interpretation of Computer Programs》
《ANSI Common Lisp》
MIT课程6.001

相关标签: lisp 算法