8.4 KiB
8.4 KiB
title | author | date | url | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|---|
自分でmaxを定義する(汚い実装) | kazu634 | 2008-09-30 | /2008/09/30/_1118/ |
|
|
id:SaitoAtsushiさんからせっかく教えてもらうも、applyをつかったうまい方法は思いつかず。。。とりあえずやっつけの汚い実装をする。問題は再帰で二回目以降が呼び出されるときに、引数が「*1」みたいになることが問題(それ以外の場合はあり得ない)のだから、
- リストの要素が1
- (car リスト)がリストである
場合に、(car リスト)を返す手続きを作ってあげればとりあえずは解決する。つまり:
(define (select lis) (if (and (= 1 (my_length lis)) (list? (car lis))) (car lis) lis))
このような手続きだ。これをふまえた上で定義するとこうなった:
(define (my_max . lis) (cond [(null? lis) #f] [(= (my_length (select lis)) 1) (car (select lis))] [(= (my_length (select lis)) 2) (cond [(<= (car (select lis)) (cadr (select lis))) (cadr (select lis))] [(>= (car (select lis)) (cadr (select lis))) (car (select lis))])] [(>= (my_length (select lis)) 3) (cond [(<= (car (select lis)) (cadr (select lis))) (my_max (cons (cadr (select lis)) (cddr (select lis))))] [(>= (car (select lis)) (cadr (select lis))) (my_max (cons (car (select lis)) (cddr (select lis))))])]))
なんだかこれは面倒だ。絶対にもっと簡単な書き方があるような気がする。
追記:
ふと振り返ってみたら、プログラミングGaucheでpick-greater, max-numberというのが書いてあった。fold手続きを使っている。可変長引数はリストになるからそれをそのまま渡せばいいのかな?
(define (max-number lis) (fold (lambda (a b) (if (< a b) b a)) (car lis) (cdr lis))) (define (my_max . args) (max-number args))
もしかしたら、可変長引数というのは結局リストになるのだから、「リストの中で一番大きい数を探す手続き」が書ければ、「可変長引数の中で一番大きな数を探す手続き」を書いたことになるのかな?
追記の追記:
apply使ってないや。。。
*1:1 2 3 4 5