2009/01/26

[scheme][Gauche]プログラミングGauche(P.56)練習問題

プログラミングGauche」P.56 練習問題

  • リストの長さを計算するlengthを直接(foldを使わずに)定義してみる
  • リストの中から、条件を満たす要素だけを抜き出したリストを返すfilterを定義してみる

 

 

length手続き。

これはいまいち。nullでもリストでもないものが渡されたときの処理を書くべきかも。

;; リストの長さを計算するlengthを直接(foldを使わずに)定義してみる
(define (length2 ls)
  (if (null? ls)
      0
      (+ 1 (length2 (cdr ls)))))

(length2 '(1 2 3 4 5)) ;; => 5
(length2 '()) ;; => 0
(length2 (cons 1 2)) ;; => ERROR: pair required, but got 2

 

 

filter手続き。

これは前回(find)の最後のとこで同じのをすでに書いてた。

;; リストの中から、条件を満たす要素だけを抜き出したリストを返すfilterを定義してみる
(define (filter predicate ls)
  (cond
   ((null? ls) '())
   ((predicate (car ls))(cons (car ls)(filter predicate (cdr ls))))
   (else (filter predicate (cdr ls)))))

(filter even? '(1 2 3 4 5 6 7 8 9 10)) ;; => (2 4 6 8 10)
(filter odd? '(1 2 3 4 5 6 7 8 9 10)) ;; => (1 3 5 7 9)
(filter even? '()) ;; => ()

2 件のコメント:

  1. このfilterだと入れ子のリストは処理できないですね

    たとえば
    (1 2 (3 4) 5 (6 7))

    返信削除
  2. こんな感じでどうでしょう・・・
    http://valvallow.blogspot.com/2009/12/scheme-filter.html

    返信削除