Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defun leonardo-collect (n)
- (cond ((= n 0) '(1))
- ((= n 1) '(1 1))
- (t
- (loop
- for counter from 2 to n
- for x = 1 then y
- for y = 1 then z
- for z = (+ 1 x y)
- collect z into results
- finally (return (append '(1 1) results))))))
- (defun leonardo2 (n) ;;; just the result
- (cond ((= n 0) 1)
- ((= n 1) 1)
- (t (loop
- for counter from 2 to n
- for x = 1 then y
- for y = 1 then z
- for z = (+ 1 x y)
- finally (return z)))))
- (defun matrix-dot-product (m1 m2 x y)
- (loop for i from 0 below (second (array-dimensions m1))
- sum (* (aref m1 x i) (aref m2 i y))))
- (defun matrix-multiply (m1 m2)
- (let ((dim1 (first (array-dimensions m1)))
- (dim2 (second (array-dimensions m2))))
- (let ((result-array (make-array (list dim1 dim2))))
- (dotimes (i dim1)
- (dotimes (j dim2)
- (setf (aref result-array i j)
- (matrix-dot-product m1 m2 i j))))
- result-array)))
- (defun matrix-power (m n)
- (cond ((= n 1) m)
- ((= 0 (mod n 2))
- (matrix-power
- (matrix-multiply m m)
- (/ n 2)))
- (t
- (matrix-multiply
- m
- (matrix-power
- (matrix-multiply m m)
- (/ (- n 1) 2))))))
- (defvar fib-matrix (make-array '(2 2) :initial-contents
- '((1 1) (1 0))))
- (defun fib-by-matrix (n)
- (cond ((= n 0) 0)
- ((= n 1) 1)
- (t ;;default case
- (aref (matrix-power fib-matrix n) 1 0))))
- (defun leonardo-by-matrix (n)
- (- (* (fib-by-matrix (+ n 1)) 2) 1))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement