2017-04-16 71 views
0

我需要爲Scheme中的類編寫一個函數,在列表中找到最小值和最大值。我們不允許使用內置的最小和最大功能。我找到了一段可以找到最大值和最小值的代碼,但是對於我來說,它輸出了最小值作爲列表的頭部。下面是代碼:在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子句中的代碼mmtemp這是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)