2017-04-16 36 views
0

Schemeにクラスの関数を書く必要があります。この関数はリストの最小値と最大値を見つけ出します。組み込みのmin関数とmax関数は使用できません。最大値と最小値を見つけるコードセグメントが見つかりましたが、私にとっては、リストの先頭として最小値を出力します。ここでは、コードは次のようになります。Schemeでmin/max関数を実装する

(define (minmax lst) 
    (cond 
    ((null? lst) '()) 
    ((null? (cdr lst)) (list (car lst) (car lst))) 
    (else 
    (let ((mmtemp (minmax (cdr lst))) (first (car lst))) 
     (cond 
     ((> first (car mmtemp)) (cons first (cdr mmtemp))) 
     ((< first (car mmtemp)) (list (car mmtemp) first)) 
     (else mmtemp)))))) 

私が入力した場合:

(minmax '(3 4 6 9 22 203 1 43 8 4)) 

私が手:

(203 3) 

私が実際に必要がある場合:

(1 203) 

私は経験がありませんスキームと講義スライドは役に立たない。出力順序を反転して正しい最小値を得るためには、何を変更する必要がありますか?

答えて

0

else節のコードを読むととなり、carが最大でcadrが最も小さいリストになります。現在の要素をと比較して最大値がで、最大値または最小値を置き換えるかどうかを決定します。したがって、あなたのロジックはそこに欠陥があります。

最小と最大の場所を切り替えるには、置き換える要素を切り替えるだけです。ここで

は、私が行っているだろうかです:

(define (minmax lst) 
    (define (helper lst min max) 
    (if (null? lst) 
     (list min max) ; result is in min and max arguments 
     (let ((cur (car lst)) (rest (cdr lst))) 
      (cond ((<= min cur max) (helper rest min max)) ; correct order 
       ((> cur max) (helper <??> <??> <??>)) 
       (else (helper <??> <??> <??>)))))) 

    (if (null? lst) 
     #f ; or perhaps signal an error? 
     (helper (cdr lst) (car lst) (car lst)))) 

(minmax '())  ; ==> #f 
(minmax '(5))  ; ==> (5 5) 
(minmax '(4 2 5 1)) ; ==> (1 5)