2016-04-03 33 views
0

Schemeで数値(整数)のリストを受け取って最大値と最小値のリストを作成する関数を作成する方法はありますかそのリストの番号?リスト内の最小値と最大値(整数)を示すSchemeの関数

私は

(define (mini a) 
(if (null? (cdr a)) (car a) 
    (min (car a) (mini(cdr a))) 
) 
) 

とmininum、それぞれの最大のための機能を作成する方法を知っている:ので、私私が欲しいもの

(define (maxi a) 
(if (null? (cdr a)) (car a) 
    (min (car a) (maxi(cdr a))) 
) 
) 

は、できるだけ簡単な方法で、両方を行うための一つの機能でありますこのパラダイムにはまったく新しいものです。

+0

あなただけのこれを行うには、再帰的アキュムレータを必要としています。他の言語でどうやってやるか考えてみてください。 – HuStmpHrrr

答えて

1

まあ、あなたはかなり近いです。あなたがすでに持っている機能を使うだけです。

(define (maximini a) (list (maxi a) (mini a))) 

優れたスキームプログラムを書くことの大部分は、機能を別々の再利用可能な手順に分解していることです。最小および最大の行動をカプセル化することは、懸念の混在です。

1つのトラバーサル

(define (min a b) (if (< a b) a b)) 
(define (max a b) (if (> a b) a b)) 

(define (maximini a) 
    (let loop [(x -inf.0) (y +inf.0) (a a)] 
    (if (empty? a) 
     (list x y) 
     (loop (max (car a) x) (min (car a) y) (cdr a))))) 

(maximini '(-4 3 2 1 10 -5)) 
; => '(10 -5) 
+0

opは、両方を行うために1つのトラバーサルを意味します。 – HuStmpHrrr

+0

本当にありがとう、私は見ることができませんでした。 – Gouki0

+0

悲しいかな、 '-inf.0'と' + inf.0'の初期値を使うと、すべてが不正確になります。 –

2

の制限がある場合は、リストと、2つの変数maxの1と最小値のための1つを持っているヘルパーを作ります。 maxminを最初の要素の値にして、新しい要素に手順maxminを現在の最大値/最小値で使用して残りの部分を反復します。リストの最後にヒットすると、最小値と最大値を保持する変数が返されます。

だから、このようsomethngになります:

(define (min-max lst) 
    (let helper ((lst (cdr lst)) (cur-min (car lst)) (cur-max (car lst))) 
    (if (null? lst) 
     (values cur-min cur-max) 
     (helper (cdr lst) 
       (min cur-min (car lst)) 
       (max cur-max (car lst)))))) 
+0

(define maximi a)\t (define(mini a) (if(null?(カーa)(car a) (min(car a)(mini(cdr a)) ) (define(maxi a) if(null?(cdr a))(car a) (MAX(車A)(マキシ(CDR A))) ) ) \t(リスト(マキシA)(ミニa))は、あまりにも動作しますが、それはでそれをしないだろうGouki0 @ \t ) – Gouki0

+0

1回ではなく2回反復する。小さなリスト(100万個以下の要素)では、おそらくそれほど大きな違いに気付かないでしょう。 – Sylwester

+0

このプロシージャを空のリストと互換性を持たせるにはどうすればよいでしょうか? – naomik

関連する問題