2016-04-03 148 views
0

有沒有一種方法可以讓Scheme中的函數接收一個數字列表(整數),然後創建一個具有最大值和最小值的列表該列表的數字?在Scheme中顯示列表中最小和最大數字(整數)的函數

我知道如何讓每一個最大的功能,

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

以及最小值:

(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))) 

寫好計劃程序的一大部分是將功能分解爲單獨的可重用程序。封裝最小和最大行爲是一個擔憂的混合。

如果有一個穿越

(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意味着一個遍歷來做這兩個。 – HuStmpHrrr

+0

非常感謝,非常明顯,我看不到。 – Gouki0

+0

唉,使用'-inf.0'和'+ inf.0'的初始值強制所有東西都是不精確的。 :-(嘗試'(max -inf.0 0)'看看你得到的回報 –

2

的限制使你有列表和兩個變量,一個是最大和一個最小的輔助工具。你可以用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(maximini a)\t (define(mini a) (if(null?(carr)(car a))(car a) (min(car a)(mini(cdr a))) ) ) (define(maxi a) (MAX(車)(MAXI(CDR一))) ) ) \t(名單(MAXI一)(小一)) \t ) – Gouki0

+0

@ Gouki0,將工作過,但它通過做它迭代兩次而不是一次。對於小列表(低於一百萬個元素),您可能不會注意到很多差異。 – Sylwester

+0

什麼是使這個過程與空列表兼容的好方法? – naomik