Gauche のリスト処理手続き : 3
呼称: リストの簡単な処理
目的: Gauche のリスト処理の再帰呼び出しに慣れる
備考: car/cdr で再帰呼び出しするのが基本(?)
慣れないうちは「Scheme とこういうものだ」と思って付き合うべし、とあったのでサンプルをそのまま写経して体で覚える。条件や手続きは違っても car/cdr を引数に再起呼び出ししているのが共通点。
(define (last-pair lis) (if (pair? (cdr lis)) (last-pair (cdr lis)) lis)) (define (copy-list lis) (if (pair? lis) (cons (car lis) (copy-list (cdr lis))) lis)) (define (append2 a b) (if (pair? a) (cons (car a) (append2 (cdr a) b)) b)) (define (reverse2 lis) (if (null? (cdr lis)) lis (append2 (reverse2 (cdr lis)) (list (car lis)))))
練習問題にチャレンジ。値を返すために初期値を与えているのが冗長っぽい、分からないや(- -#
;; fold を使わずにリストの長さを計算する (define (length2 lis i) (if (null? lis) i (length2 (cdr lis) (+ 1 i)))) ;; リストの中から条件を満たす要素のみのリストを作成する (define (filter pred lis rlis) (cond [(null? lis) rlis] [(pred (car lis)) (filter pred (cdr lis) (append rlis (list (car lis))))] [else (filter pred (cdr lis) rlis)]))
実行結果。
gosh> (length2 '(1 3 5) 0) 3 gosh> (length2 '(1 3 5.8) 0) 3 gosh> (filter odd? '(9 1 2 8 7 5 4 6) '()) (9 1 7 5)