Lisp求平方根

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值