by shigemk2

当面は技術的なことしか書かない

リスト遊び 5-1 再帰の再帰

前回
リスト遊び 4-7 等しいリスト - by shigemk2

平たく言うと、再帰を使え、ということですね。
以前再帰かました関数を作成した。
引数はリストだったが、リストの中身は全てアトムだった。
リストの中身がリストでも、関数が使えるようにしてみる。

(defun sum (lst)
  (cond
   ((null lst) 0)
   (t (+ (car lst) (sum (cdr lst))))))
sum
(sum '(1 3 5))
9

(defun sum* (lst)
  (cond
   ((null lst) 0)
   ((consp (car lst))
    (+ (sum* (car lst)) (sum* (cdr lst))))
   (t (+ (car lst) (sum* (cdr lst))))))
sum*
(sum* '(1 (2) (3 (4)) (5 (6 (7)))))
28

再帰の定石(入れ子のリスト篇)

  • 終了条件を調べ、終了なら初期値を返す
  • リストの先頭の要素に対して仕事をする。リストの先頭の要素がリストなら、そのリストと共に、自分自身を呼び出す
  • リストの残りと共に自分自身を呼び出す

リスト遊び―Emacsで学ぶLispの世界 (ASCII SOFTWARE SCIENCE Language)

リスト遊び―Emacsで学ぶLispの世界 (ASCII SOFTWARE SCIENCE Language)