by shigemk2

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

リスト遊び 7-3 数え上げ

前回
リスト遊び 7-2 while - by shigemk2

lispにはforは存在しないが、
whileで代用できる

(make-list 3 'dog)
=> (dog dog dog)

を、whileで表現する

(defun make-list (n x)
  (let ((i 0) ret)
    (while (< i n) ;; n回consしたらいいんです
      (setq ret (cons x ret))
      (setq i (1+ i)))
    ret))
make-list
(make-list 3 'dog)
(dog dog dog)
(make-list 7 'guineapig)
(guineapig guineapig guineapig guineapig guineapig guineapig guineapig)

階乗

(defun factorial (n)
  (let ((i 1) (fac 1))
    (while (<= i n) ;; nまでiの値を掛け続ける
      (setq fac (* i fac))
      (setq i (1+ i)))
    fac))
factorial
(factorial 10)
3628800
(factorial 19)
121645100408832000

フィボナッチ

(defun fibonacci (n)
  ;; x=n-1 y=n
  ;; ループはi=3から
  (let ((x 1) (y 1) (i 3) tmp)
  (while (<= i n)
    (setq tmp y)
    (setq y (+ y x))
    (setq x tmp)
    (setq i (1+ i)))
  y))
fibonacci
(fibonacci 10)
55

ただし、一時的な変数tmpを使うのはコード的に美しくない。

フィボナッチ 改(tmpを使わない)

(defun fibonacci (n)
  ;; x=n-1 y=n
  (let ((x 1) (y 1) (i 3))
  (while (<= i n)
    (setq y (+ x y))
    (setq x (- y x))
    (setq i (1+ i)))
  y))
fibonacci
(fibonacci 10)
55

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

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