本を読む

読書やコンピュータなどに関するメモ

Re: FizzBuzzでLisp脳

Karetta|Gaucheプログラミング|「Lisp脳」の謎に迫る - Schemeプログラマの発想

> Schemeプログラマの発想の一端がお分かりいただけたでしょうか?

 なるほど、本物のSchemeプログラマの人はこういうふうに発想するのか。すごく参考になる。

 ちょっとLispをかじった素人の私の場合、とりあえず、何と何をconsするかを中心に考えてしまうのだよなぁ。

 たとえば、FizzBuzzで、こういう関数を作るとする。

(fizzbuzz 100)

 これは、nのときの演算結果と、n - 1のfizzbuzzをconsしてやればいいと考える。

(define (fizzbuzz n)
  (cons
    ; なんか演算した値
    (fizzbuzz (- n 1)) ))

 このままだと停止しない。0のときに()を返せば、1のときは演算結果と()をconsして、1要素のリストになる。

(define (fizzbuzz n)
  (if (zero? n)
    ()
    (cons
      ; なんか演算した値
      (fizzbuzz (- n 1)) )))

 続いて、「なんか演算した値」の部分を埋めてみる。

(define (fizzbuzz n)
  (if (zero? n)
    ()
    (cons
      (cond ((zero? (modulo n 15)) "FizzBuzz")
            ((zero? (modulo n 3)) "Fizz")
            ((zero? (modulo n 5)) "Buzz")
            (else n) )
      (fizzbuzz (- n 1)) )))

 末尾再帰なので、つまりはループですな。2007.8.8修正:末尾再帰でもないし、単純にループにもならない。

 元エントリのループの例と同じような構造のコードだと思う。で、実行。

(print (fizzbuzz 100))
(Buzz Fizz 98 97 Fizz Buzz 94 Fizz 92 91 FizzBuzz 89 88 Fizz 86 Buzz Fizz 83 82 Fizz Buzz 79 Fizz 77 76 FizzBuzz 74 73 Fizz 71 Buzz Fizz 68 67 Fizz Buzz 64 Fizz 62 61 FizzBuzz 59 58 Fizz 56 Buzz Fizz 53 52 Fizz Buzz 49 Fizz 47 46 FizzBuzz 44 43 Fizz 41 Buzz Fizz 38 37 Fizz Buzz 34 Fizz 32 31 FizzBuzz 29 28 Fizz 26 Buzz Fizz 23 22 Fizz Buzz 19 Fizz 17 16 FizzBuzz 14 13 Fizz 11 Buzz Fizz 8 7 Fizz Buzz 4 Fizz 2 1)

 逆順はダメですか。じゃnreverse、いやSchemeなのでreverse!。

(define (fizzbuzz n)
  (define (fb n)
    (if (zero? n)
      ()
      (cons
        (cond ((zero? (modulo n 15)) "FizzBuzz")
              ((zero? (modulo n 3)) "Fizz")
              ((zero? (modulo n 5)) "Buzz")
              (else n) )
        (fb (- n 1)) )))
  (reverse! (fb n)) )

コメント

とりあえずconsしてみる、

というのは決して悪いアプローチではないと思いますよ。
(consするというのは再帰的に考えるということだから)
少し慣れてくるとmapやらfilterやらfoldやらを使って再帰を見えなくするようになります。

えんどうさん、ありがとうございます

ご本人にコメントいただき、光栄です!
アプローチが悪くないということで、安心しました。この方向でmapとかをマスターしていけばいいんですね。Lispがんばります。

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/227-397d2e17

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad