66 lines
1.6 KiB
Common Lisp
66 lines
1.6 KiB
Common Lisp
(defun pascal-lower (n &aux (a (make-array (list n n) :initial-element 0)))
|
|
(dotimes (i n)
|
|
(setf (aref a i 0) 1))
|
|
(dotimes (i (1- n) a)
|
|
(dotimes (j (1- n))
|
|
(setf (aref a (1+ i) (1+ j))
|
|
(+ (aref a i j)
|
|
(aref a i (1+ j)))))))
|
|
|
|
(defun pascal-upper (n &aux (a (make-array (list n n) :initial-element 0)))
|
|
(dotimes (i n)
|
|
(setf (aref a 0 i) 1))
|
|
(dotimes (i (1- n) a)
|
|
(dotimes (j (1- n))
|
|
(setf (aref a (1+ j) (1+ i))
|
|
(+ (aref a j i)
|
|
(aref a (1+ j) i))))))
|
|
|
|
(defun pascal-symmetric (n &aux (a (make-array (list n n) :initial-element 0)))
|
|
(dotimes (i n)
|
|
(setf (aref a i 0) 1 (aref a 0 i) 1))
|
|
(dotimes (i (1- n) a)
|
|
(dotimes (j (1- n))
|
|
(setf (aref a (1+ i) (1+ j))
|
|
(+ (aref a (1+ i) j)
|
|
(aref a i (1+ j)))))))
|
|
|
|
? (pascal-lower 4)
|
|
#2A((1 0 0 0) (1 1 0 0) (1 2 1 0) (1 3 3 1))
|
|
? (pascal-upper 4)
|
|
#2A((1 1 1 1) (0 1 2 3) (0 0 1 3) (0 0 0 1))
|
|
? (pascal-symmetric 4)
|
|
#2A((1 1 1 1) (1 2 3 4) (1 3 6 10) (1 4 10 20))
|
|
|
|
;In case one really insists in printing the array row by row:
|
|
|
|
(defun print-matrix (a)
|
|
(let ((p (array-dimension a 0))
|
|
(q (array-dimension a 1)))
|
|
(dotimes (i p)
|
|
(dotimes (j q)
|
|
(princ (aref a i j))
|
|
(princ #\Space))
|
|
(terpri))))
|
|
|
|
? (print-matrix (pascal-lower 5))
|
|
1 0 0 0 0
|
|
1 1 0 0 0
|
|
1 2 1 0 0
|
|
1 3 3 1 0
|
|
1 4 6 4 1
|
|
|
|
? (print-matrix (pascal-upper 5))
|
|
1 1 1 1 1
|
|
0 1 2 3 4
|
|
0 0 1 3 6
|
|
0 0 0 1 4
|
|
0 0 0 0 1
|
|
|
|
? (print-matrix (pascal-symmetric 5))
|
|
1 1 1 1 1
|
|
1 2 3 4 5
|
|
1 3 6 10 15
|
|
1 4 10 20 35
|
|
1 5 15 35 70
|