Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" Newsgroups: comp.lang.lisp,comp.lang.scheme Subject: Re: iterative-version for computing a Fibonacci number Date: Thu, 5 Sep 2024 12:54:00 -0000 (UTC) Organization: A noiseless patient Spider Lines: 80 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Injection-Date: Thu, 05 Sep 2024 14:54:00 +0200 (CEST) Injection-Info: dont-email.me; posting-host="76f95d5b05e6d11ad292fc2b60a074b6"; logging-data="376556"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1++Ymx3MjL91kZSIagDRqA4" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:aCwYKCWay3k6UVdfDpQA72DtzFw= Bytes: 3835 Raffael Cavallaro wrote: > > Hi, perhaps someone can help me translate my Python version? > > (defun fib (x) > (do ((a 0 b) ;; do loop variable a is initially 0, then b > (b 1 (+ a b)) ;;loop variable b is initially 1 then a + b > (i 1 (1+ i))) ;;loop index incremented by 1 each go round > ((> i x) a))) ;;termination condition - when index passes x stop > ;; and return a > > (defun fib-evens (limit) > "find the sum of all the even fibonacci numbers less than 1 million" > (loop for i from 1 ;;loop index starts at 1 implicitly incremented by 1 > as current = (fib i) ;;compute fib of the current index > while (< current limit) ;;stop if index exceeds limit > when (evenp current) sum current)) ;;sum all the even fibs and > return this sum > > CL-USER> (time (fib-evens 1000000)) ;; time the sum of all the even > fibs less than a million > Evaluation took: > 0.0 seconds of real time > 8.e-6 seconds of user run time ;;; took about one > onehundredthousandth of a second > 1.e-6 seconds of system run time > 0 page faults and > 0 bytes consed. > 1089154 ;; here's your answer Gauche Scheme (define (sum-even-fibs limit) (loop (a 1 b 1 sum 0) (:till (>= a limit)) (if (even? a) (inc! sum a)) (sset! a b b (+ a b)))) (sum-even-fibs 999999) ===> 1089154 Given: (define-syntax sset!-aux (syntax-rules () [(sset!-aux (var val more ...) (pairs ...)) (sset!-aux (more ...) (pairs ... (var val)))] [(sset!-aux () ((var val) ...)) (set!-values (var ...) (values val ...))])) (define-syntax sset! (syntax-rules () [(sset! x ...) (sset!-aux (x ...) ())])) (define-syntax loop-aux (syntax-rules (:till :=) [(loop-aux (var val more ...) (good ...) stuff ...) (loop-aux (more ...) (good ... (var val)) stuff ...)] [(loop-aux (var) (good ...) stuff ...) (loop-aux () (good ... (var '())) stuff ...)] [(loop-aux lets goodlets (stuff ... (:till what result)) (seen ...) go) (loop-aux lets goodlets (stuff ...) ((if what result (begin seen ...))) go)] [(loop-aux () (pairs ... (k v)) (stuff ... (:till what)) (seen ...) go) (loop-aux () (pairs ... (k v)) (stuff ... (:till what k)) (seen ...) go)] [(loop-aux lets goodlets (stuff ... (:till what)) (seen ...) go) (loop-aux lets goodlets (stuff ...) ((unless what seen ...)) go)] [(loop-aux lets goodlets (stuff ... (x := z)) (seen ...) go) (loop-aux lets goodlets (stuff ...) ((let ((x z)) seen ...)) go)] [(loop-aux lets goodlets (stuff ... last) (seen ...) go) (loop-aux lets goodlets (stuff ...) (last seen ...) go)] [(loop-aux lets goodlets () (seen ...) go) (let* goodlets (let go () seen ...)) ])) (define-syntax loop (syntax-rules () [(loop lets things ...) (loop-aux lets () (things ...) ((go)) go)]))