RosettaCodeData/Task/Pascal-matrix-generation/Scheme/pascal-matrix-generation-1.scm

53 lines
1.3 KiB
Scheme

(import (srfi 25))
(define-syntax dotimes
(syntax-rules ()
((_ (i n) body ...)
(do ((i 0 (+ i 1)))
((>= i n))
body ...))))
(define (pascal-upper n)
(let ((p (make-array (shape 0 n 0 n) 0)))
(dotimes (i n)
(array-set! p 0 i 1))
(dotimes (i (- n 1))
(dotimes (j (- n 1))
(array-set! p (+ 1 i) (+ 1 j)
(+ (array-ref p i j)
(array-ref p (+ 1 i) j)))))
p))
(define (pascal-lower n)
(let ((p (make-array (shape 0 n 0 n) 0)))
(dotimes (i n)
(array-set! p i 0 1))
(dotimes (i (- n 1))
(dotimes (j (- n 1))
(array-set! p (+ 1 i) (+ 1 j)
(+ (array-ref p i j)
(array-ref p i (+ 1 j))))))
p))
(define (pascal-symmetric n)
(let ((p (make-array (shape 0 n 0 n) 0)))
(dotimes (i n)
(array-set! p i 0 1)
(array-set! p 0 i 1))
(dotimes (i (- n 1))
(dotimes (j (- n 1))
(array-set! p (+ 1 i) (+ 1 j)
(+ (array-ref p (+ 1 i) j)
(array-ref p i (+ 1 j))))))
p))
(define (print-array a)
(let ((r (array-end a 0))
(c (array-end a 1)))
(dotimes (row (- r 1))
(dotimes (col (- c 1))
(display (array-ref a row col))
(display #\space))
(newline))))