プログラミングGaucheの練習問題(filter,length)

プログラミングGaucheの6.5の練習問題(P54)をしてみる。

Filter手続き

先頭の要素が条件を満たせば、その要素と再帰したfilter結果をくっつけたものを返す。満たせなければ、単にfilter結果を返す。
(define (filter pred lis)
  (if (null? lis)
      (list )
      (if (pred (car lis) )
          (cons (car lis)  (filter pred  (cdr lis) ))
          (filter pred  (cdr lis)) )))

length手続き

再帰毎の結果に1つづカウントしていくかたち。
(define (length lis)
  (if (null? lis)
      ( 0)
      (+ (length(cdr lis)) 1) ) )

末尾再帰でないので、あまりよくないですね。と思っていたら本の2ページ後に末尾再帰れの実装も載っていました。


で、使った例。

(print (filter (lambda  (x) (> x 4 ) )  '(1 2 3 4  5 6 8) ))
(print (length '(1 2 3 4)) )
  • >
(5 6 8)
4

ま、とりあえず意図どおり。