November 23, 2008
at
Sunday, November 23, 2008
Labels:
Computer Science,
Lisp,
SICP
Posted by
Billy
Exercise 1.3
Define a procedure that takes three numbers as arguments and returns the sum of the squares of the two larger numbers.
(defun square (x) (* x x))
(defun sum-of-squares (lst)
(apply #'+ (mapcar #'square lst)))
(defun get-largest-2 (lst)
(when (>= (length lst) 2)
(let ((sorted-lst (sort lst #'>)))
(list (first sorted-lst)
(second sorted-lst)))))
;;; This does better and takes any number of arguments
(defun sum-sqr-lrgst (lst)
(sum-of-squares (get-largest-2 lst)))
Exercise 1.8
Newton's method for cube roots is based on the fact that if y is an approximation to the cube root of x, then a better approximation is given by the value
(x/y^2 + 2y)/3
Use this formula to implement a cube-root procedure analogous to the square-root procedure.
(defconstant +tolerance+ 0.001)
(defun cube (x) (* x x x))
(defun good-enough-p (guess x)
"Returns true if the cube of the guess differs from x by less
than the tolerance"
(< (abs (- (cube guess) x)) +tolerance+))
(defun improve (guess x)
"Returns a better approximation of the cube root of x"
(/ (+ (/ x
(square guess))
(* 2 guess))
3))
(defun cube-rt-iter (guess x)
(if (good-enough-p guess x)
guess
(cube-rt-iter (improve guess x) x)))
(defun cube-rt (x)
"Calculates the cube root of x"
(cube-rt-iter 1.0 x))
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment