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. 1番目と2番目の要素を比べて大きい方を返す。
  2. 上の結果と3番目の要素を比べて大きい方を返す。
  3. 上の結果と、、、
  4. ということで、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)

あってた。

今日はここまで。