An Introduction to Programming in Emacs Lisp Chapter 11
再帰をやっていたら,今頃,The Little Shemer をやっていた頃の記憶が,
若干よみがえった。ピザを思い出す。
あの本,楽しかったという思い出があるけど,
もちっとまとめて,体系づけてくれていたら,
さらにいい本になるのにね。ま,遠い記憶なのでいいや。
Chapter 11
- while
- nil を返す
- cdr
- with shortening a list
- (setq target-list (cdr target-list)
- counter
- with incrementing or decrementing a counter
- (setq counter (1+ counter))
- 1+
- 1-
- Macros
- dolist
- リスト用
- VAR
- リスト中の各要素
- LIST
- RESUTL
- dolist の終わりに評価される
- dotimes
- カウンター用
- NUMBER
- HOW MANY TIMES
- RESULT
- dotimes の終わりに評価される
- for (i = 0; i < n; ++i) みたいなもん
- dolist
- Recursion
- 構造
- do-again-test
- body
- recursive call
- with next-step-expression
- (cdr list)
- (+1 counter)
- with next-step-expression
- cond
- if, else if, else if, else
- Recursive Patterns
- every
- 名前のまんま
- 各要素に対して,何かする
- optionally, combine the acted-on elem using cons
- square-each
- accumulative
- 積み上げていくイメージ
- that's why `accumulative'
- add-elements
- immediate calculatoins are deferred
- 積み上げていくイメージ
- keep
- every パターンにくりそつ
- test
- act on passed elements
- skip on failed elements
- keep-three-letter-words
- every
- No Deferment
- initialization function
- helper function
- helper function を呼ぶときに,必要な状態を渡す
- tail recursive
- uses constant space
- no deferment
- 構造
Exercise
;;; Exercise 11.4 (defun sum-of-squares (number) "Return the sum of squares of integers in [1,NUMBER]." (let ((total 0)) (while (> number 0) (setq total (+ total (* number number))) (setq number (1- number))) total)) (sum-of-squares 10) ; => 14 (defun factorial (number) "Return factorial NUMBER." (let ((total 1)) (while (> number 0) (setq total (* total number)) (setq number (1- number))) total)) (factorial 5) ; => 120 (defun sum-of-squares-recursively (number) "Return the sum of square of integers in [1,NUMBER]." (if (= number 1) 1 (+ (* number number) (sum-of-squares-recursively (1- number))))) (sum-of-squares-recursively 10) ; => 385 (/ (* 10 11 21) 6) ; => 385 (defun factorial-recursively (number) "Return factorial NUMBER." (if (= number 1) 1 (* number (factorial-recursively (1- number))))) (factorial-recursively 5) ; => 120 (defun sum-of-squares-recursively-cond (number) "" (cond ((< number 1) 0) ((= number 1) 1) (t (+ (* number number) (sum-of-squares-recursively-cond (1- number)))))) (sum-of-squares-recursively-cond 10) ; => 385 (defun factorial-recursively-cond (number) "" (cond ((< number 1) 0) ((= number 1) 1) (t (* number (factorial-recursively-cond (1- number)))))) (factorial-recursively-cond 5) ; => 120