前回
リスト遊び 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)
- 作者: 山本和彦
- 出版社/メーカー: アスキー
- 発売日: 2000/05
- メディア: 単行本
- 購入: 2人 クリック: 76回
- この商品を含むブログ (44件) を見る