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-07

L-99 (31)

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

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

P31

解答
;; Common Lisp
(defun is-prime (n)
  (cond ((< n 2) nil)
	((= n 2) t)
	((= n 3) t)
	((zerop (mod n 2)) nil)
	('t (do ((i 3 (+ i 2))
		 (fin n (multiple-value-bind (quotient remainder)
			    (floor n i)
			  (if (zerop remainder) 
			      (return nil)
			      quotient))))
		((> i fin) t)))))

;; Scheme
(define is-prime
  (lambda (n)
    (call/cc
     (lambda (return)
       (cond ((< n 2) #f)
	     ((= n 2) #t)
	     ((= n 3) #t)
	     ((zero? (modulo n 2)) #f)
	     (else (let loop ((i 3)
			      (fin n))
		     (if (> i fin)
			 #t
			 (loop (+ i 2)
			       (if (zero? (remainder n i))
				   (return #f)
				   (quotient n i))))))))))) 

28問目でリスト操作篇は終了し、番号が抜けて31問目か

ら算術篇突入。

今回は、与えられた数が素数であるかを判定する関数を

作成するのが問題。

色々アルゴリズムはあるようだけれども理解できないの

で、単純に割切れるかどうかを力ずくで確認することに

して、思い付きでちょっと工夫してみた。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20070307