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

L-99 (61)

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

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

また難しいのに遭遇したので、スキップ。

P61は二分木の葉っぱの数を勘定する関数の作成が課題。

再帰的じゃない書き方にも挑戦してみた。

P61

解答
;; Lisp Machine Lisp
(defun count-leaves (tree)
  (if (null tree)
      0
    (+ 1
       (count-leaves (second tree))
       (count-leaves (third tree)))))

;; Common Lisp
(DEFUN COUNT-LEAVES (TREE)
  (PROG (TOTAL JOB TMP)
        (SETQ TOTAL 0)
	(PUSH TREE  JOB)
     L  (COND ((ENDP JOB) (RETURN TOTAL)))
	(AND (SETQ TMP (POP JOB))
	     (SETQ TOTAL (1+ TOTAL))
	     (PUSH (CADDR TMP) JOB)	;Right
	     (PUSH (CADR TMP)  JOB))	;Left
	(GO L)))

;; Scheme
(define (count-leaves tree)
  (let loop ((count 0) 
	     (job tree))
    (if (null? job)
	count
	(if (pair? (car job))		;list
	    (loop (+ count 1)		
		  (cdr `(,@(car job) ,@(cdr job))))
	    (if (null? (car job))	;atom
		(loop count (cdr job))
		(loop (+ count 1) (cdr job)))))))