とりあえず素直に書き下してみた
http://www.aoky.net/articles/jeff_atwood/why_cant_programmers_program.htm
なんかすげー冗長な気がするけど。どうやったらかっこよくなるんだろう
(define (Fizz-Buzz n) (define (rev n) (if (= n 0) '() (cond ((and (= (remainder n 3) 0) (= (remainder n 5) 0)) (cons 'FizzBuzz (rev (- n 1)) )) ((= (remainder n 3) 0) (cons 'Fizz (rev (- n 1)))) ((= (remainder n 5) 0) (cons 'Buzz (rev (- n 1)))) (else (cons n (rev (- n 1))))))) (reverse (rev n))) (Fizz-Buzz 100)
追記:末尾再帰のほうがシンプルになった。まだ長いけど
(define (Fizz-Buzz n) (define (iter n a) (if (= n 0) a (cond ((= (remainder n 15) 0) (iter (- n 1) (cons 'FizzBuzz a))) ((= (remainder n 3) 0) (iter (- n 1) (cons 'Fizz a))) ((= (remainder n 5) 0) (iter (- n 1) (cons 'Buzz a))) (else (iter (- n 1) (cons n a)))))) (iter n '())) (Fizz-Buzz 100)
((lambda (n) (define (iter n a) (if (= n 0) a (cond ((= (remainder n 15) 0) (iter (- n 1) (cons 'FizzBuzz a))) ((= (remainder n 3) 0) (iter (- n 1) (cons 'Fizz a))) ((= (remainder n 5) 0) (iter (- n 1) (cons 'Buzz a))) (else (iter (- n 1) (cons n a)))))) (iter n '())) 100)
佐野さんの添削により改良
((lambda (n) (define (i n a) (if (= n 0) a (i (- n 1) (cond ((= (remainder n 15) 0) (cons 'FizzBuzz a)) ((= (remainder n 3) 0) (cons 'Fizz a)) ((= (remainder n 5) 0) (cons 'Buzz a)) (else (cons n a)))))) (i n '())) 100)