From 3c396b5f3c84c628c746aba342642091bb9efa99 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 9 Sep 2014 01:48:28 +0900 Subject: [PATCH] gcd and lcm take variable-length arguments --- piclib/scheme/base.scm | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/piclib/scheme/base.scm b/piclib/scheme/base.scm index ad8a1679..5fc30a9d 100644 --- a/piclib/scheme/base.scm +++ b/piclib/scheme/base.scm @@ -232,15 +232,27 @@ (lambda (q r) r))) - (define (gcd i j) - (if (> i j) - (gcd j i) - (if (zero? i) - j - (gcd (truncate-remainder j i) i)))) + (define (gcd . args) + (define (gcd i j) + (cond + ((> i j) (gcd j i)) + ((< i 0) (gcd (- i) j)) + ((> i 0) (gcd (truncate-remainder j i) i)) + (else j))) + (let loop ((args args) (acc 0)) + (if (null? args) + acc + (loop (cdr args) + (gcd acc (car args)))))) - (define (lcm i j) - (/ (* i j) (gcd i j))) + (define (lcm . args) + (define (lcm i j) + (/ (* i j) (gcd i j))) + (let loop ((args args) (acc 1)) + (if (null? args) + acc + (loop (cdr args) + (lcm acc (car args)))))) (define (square x) (* x x))