Hatena::Groupcsnagoya-sicp

mzpの日記

2008-11-09

宿題(1.14-1.20)

はてなブックマーク - 宿題(1.14-1.20) - mzpの日記

ボクはコードが書きたいんだ、コードが。作用回数とかはprintを埋めこんでズルしよう。

1.16

初めは問題の意味がよく分からなかったけど、要するにexpr-fastを末尾再帰で実装しろって意味だろう。

(define (expt-iter a b n)
  (if (= n 0)
      a
      (if (= (remainder n 2) 0)
	  (expt-iter a (* b b) (/ n 2))
	  (expt-iter (* a b) b (- n 1)))))

1.17

さすがに*を再定義するのは怖かったので、名前は変えた。

(define (times a b)
  (if (= b 0)
      0
      (if (= (remainder b 2) 0)
	  (times (double a) (halve b))
	  (+ a (times a (- b 1))))))

1.18

(define (times-iter a b c)
  (if (= b 0)
      c
      (if (= (remainder b 2) 0)
	  (times-iter (double a) (halve b) c)
	  (times-iter a (- b 1) (+ a c)))))

1.19

わかんない。だれか教えて。>
トラックバック - http://csnagoya-sicp.g.hatena.ne.jp/mzp/20081109

2008-10-28

beginは悪くないよ

はてなブックマーク -  beginは悪くないよ - mzpの日記

id:gabuchan:20081027:1225094969

beginに対して上級者の人はどう思ってるのか聞きたい。

ボクは上級者じゃないけど答えちゃうよー。

beginそのものは別に悪くないと思います。ボクもよく使います。

ただbeginが必要な場面というのは、printとかの副作用のある関数を使う場面だと思います。こういう副作用のある処理は最上位にだけとどめておくほうが、よりLisp的・関数型言語的かなぁ、と思ってます。

参考: no title

詳しくは本当の上級者のd:id:Gemma先生やd:id:athosが語ってくれるはずっ。

gabuchangabuchan2008/10/29 00:44フォローありがとうございます。参考のリンク先も眉唾もんでした。いろいろ知っていくと、Lisp&関数型がますます好きになりそうです。

トラックバック - http://csnagoya-sicp.g.hatena.ne.jp/mzp/20081028

2008-10-27

パスカルの三角形

はてなブックマーク - パスカルの三角形 - mzpの日記

(use srfi-1)
(define (pascal n k)
  (cond [(= n 0) 1]
	[(= k 0) 1]
	[(= n k) 1]
	[else (+ (pascal (- n 1) k) (pascal (- n 1) (- k 1)))]))

(define (pascal-line n)
  (map (cut pascal n <>) (iota (+ n 1))))

(define (pascal-tri n)
  (string-join
   (map (lambda (k)
	  (string-append 
	   (make-string (- n k) #\space)
	   (string-join (map number->string (pascal-line k)) " ")))
	(iota n))
   "\n"))

id:clairvyさんが描画もしろー、っていっていたので。

(print (pascal-tri 4))
    1
   1 1
  1 2 1
 1 3 3 1
#<undef>

;; 2桁になると崩れる
gosh> (print (pascal-tri 10))
          1
         1 1
        1 2 1
       1 3 3 1
      1 4 6 4 1
     1 5 10 10 5 1
    1 6 15 20 15 6 1
   1 7 21 35 35 21 7 1
  1 8 28 56 70 56 28 8 1
 1 9 36 84 126 126 84 36 9 1
#<undef>

末尾再帰だけど、反復的プロセスじゃないやつ

はてなブックマーク - 末尾再帰だけど、反復的プロセスじゃないやつ - mzpの日記

いわゆるCPS

(define (fact k n)
  (if (= n 1)
      (k 1)
      (fact (lambda (m) (k (* n m))) (- n 1))))

こうすると末尾再帰だけど、呼ぶたびにkがどんどん膨らんでいくので、反復的じゃなくなる。

てすと

はてなブックマーク - てすと - mzpの日記

(display "Hello,world!!")
トラックバック - http://csnagoya-sicp.g.hatena.ne.jp/mzp/20081027