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-04-12

L-99 (71)

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

L-99 P71に挑戦 - L-99:Ninety-Nine Lisp Problems

今回のお題は、多分岐ツリーで各ノードの根までの距離

のツリー全体の総和を求める関数の作成。

素直に作成。

P71

解答
;; Common Lisp
(defun internal-path-length (tree)
  (labels ((ipl (tree depth)
	     (cond ((> 2 (length tree)) 0)
		   ('T (apply #'+ 
			      (1- (length tree)) 
			      (mapcar #'(lambda (l)
					  (+ depth (ipl l (1+ depth))))
				      (cdr tree)))))))
    (ipl tree 0)))

;; Scheme 
(define (internal-path-length tree)
  (let ipl ((tr tree) (depth 0))
    (cond ((> 2 (length tr)) 0)
	  (else (apply +
		       (- (length tr) 1)
		       (map (lambda (l)
			      (+ depth (ipl l (+ 1 depth))))
			    (cdr tr)))))))