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) みたいなもん
  • Recursion
    • 構造
      • do-again-test
      • body
      • recursive call
        • with next-step-expression
          • (cdr list)
          • (+1 counter)
    • 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
    • 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