Gauche本勉強メモ(4日目)
6.3 リストの走査
fold
手続きと初期値、リストを引数にとり、初期値とリストの最初の値を手続きに渡し、その結果とリストの2番目の値を手続きに渡し、、、という処理を行う手続き。
ちょっとわかりにくい。
gosh> (fold + 0 '(1 2 3 4 5)) 15 gosh> (fold * 1 '(1 2 3 4 5)) 120
数のリストのうち、最大のものを求めるという手続きmax-numberはどう書くか?
書いてみる。
max-numberの行う手順をかんがてみる。
- 1番目と2番目の要素を比べて大きい方を返す。
- 上の結果と3番目の要素を比べて大きい方を返す。
- 上の結果と、、、
- ということで、2つの数をくらべて大きい方を返す手続きがあればできそう。
(define (max-number lis) (fold (lambda (a b) (if (> a b) a b)) (car lis) (cdr lis))) gosh> (max-number '(1 3 4 5 2 4 23 10 -8)) 23
できてんじゃない?
本にあった例は
(define (max-number lis) (define (pick-greater a b) (if (> a b) a b)) (fold pick-greater -inf.0 lis))
lambdaと初期値が違う。lambdaは本ではまだ出てきてないから。
初期値はおれのやつだと空リストだとダメだから、そこの処理が必要だった。
他にもfold使用の例として本に載っていたもの
;;; リストの長さを数える (define (length lis) (define (increment2 a b) (+ b 1)) ; 第2引数に1を加える手続き (fold increment2 0 lis)) ;;; リストの要素を順に出力する (define (print-elements lis) (define (print-one-element a b) (print a)) (fold print-one-element #f lis)) ; #fをprintしても表示されないのか?
練習問題
(fold cons '() '(a b c d e))
はどういう動作をするか?
考えてみた。(e d c b a)というリストを返すんじゃないかな?
gosh> (fold cons '() '(a b c d e)) (e d c b a)
あってた。
今日はここまで。