Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-03-25

L-99 (39)

| 19:29 | L-99 (39) - わだばLisperになる を含むブックマーク はてなブックマーク - L-99 (39) - わだばLisperになる

L-99 39問目に挑戦 - L-99:Ninety-Nine Lisp Problems

P39

解答
;; Common Lisp
(load "is-prime")

(defun prime-list (start end)
  (do ((i start (1+ i))
       (retlist '() (if (is-prime i) 
			`(,@retlist ,i)
			retlist)))
      ((= i end) retlist)))

;; -- rangeを使用してみた版
(load "is-prime")
(load "range")

(defun prime-list (start end)
  (remove-if-not #'is-prime
		 (range start end)))

;; -- 関数を引数に取れるようにrangeを変更して、そ
;;    れに次の素数を探してくるような関数を適用して
;;    みた版
(defun prime-list (start end)
  (range start end #'next-prime))

(defun next-prime (n)
  (do ((i (1+ n) (1+ i)))
      ((is-prime i) i)))

(defun range (start end &optional (pred #'1+))
  (do ((i (funcall pred (1- start)) (funcall pred i))
       (retlist '() `(,@retlist ,i)))
      ((> i end) retlist)))

;; Scheme
(load "is-prime")

(define prime-list 
  (lambda (start end)
    (let loop ((i start)
	       (retlist '()))
      (if (= i end)
	  retlist
	  (loop (+ i 1)
		(if (is-prime i)
		    `(,@retlist ,i)
		    retlist))))))

指定された範囲内の素数のリストを返す関数を作成する

のが今回のお題。

何の捻りもなく作成。