« Project Euler - Problem 44 | トップページ | Scheme でクイックソート »

2009年4月26日 (日)

Project Euler - Problem 39 : ループの抽象化

問題はこちら

今回は、以前紹介した pythagorean-triples を使って、1000 未満の偶数を総当たりしていますが、できるだけ Scheme らしいコードを書くつもりで、for-each を使ってループを抽象化してみました。(でも、set! を使っているのはちょっと無粋かな?)

さらに、pythagorean-triples 自体もループの抽象化を試みてみました。

(define pythagorean-triples (case-lambda ([n] (pythagorean-triples n #f)) ([n flag] (define check-b (lambda (a) (let ([b (- n (/ (* n n) (- n a) 2))]) (if [and (integer? b) (< a b)] (list a b (- n a b)) #f)))) (if [odd? n] '() (let* ([lst-a (sequence 1 (real->integer (/ n 3)))] [lst-b (remq #f (map check-b lst-a))]) (if flag (filter (lambda (lst) (= 1 (apply gcd lst))) lst-b) lst-b)))))) (define problem-039 (lambda (n-max) (let ([v-max '(0 . 0)]) (for-each (lambda (x) (let ([len (length (pythagorean-triples x))]) (if [> len (cdr v-max)] (set! v-max (cons x len))))) (seq 4 n-max 2)) (printf "~d~%" (car v-max))))) (problem-039 999)

P.S. これまでにこのブログで紹介した自作の手続きは、説明抜きで使用しています。R5RS や R6RS に記載されていない手続きに関しては、過去のブログを探してみてください。

« Project Euler - Problem 44 | トップページ | Scheme でクイックソート »

Project Euler」カテゴリの記事

Scheme」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/44800148

この記事へのトラックバック一覧です: Project Euler - Problem 39 : ループの抽象化:

« Project Euler - Problem 44 | トップページ | Scheme でクイックソート »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ