Lisp求平方根

朧月夜い發表於2020-11-06

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

相關文章