2011-05-15 54 views
4

我想使用預定義函數(max)(R5RS)與數字的list,其在長度上變化。不幸的是,(max)接受這樣的輸入:如何將Scheme列表分解爲要傳遞給過程的參數?

(max 2 43 5 6) 
=> 43 

我試圖使用它,像這樣:

(define lst '(3 5 53 4 53 54 32)) 
(max lst) 

這將產生以下錯誤。

max: expects argument of type <real number>; given (3 5 53 4 53 54 32) 

我怎樣才能打破這個名單爲各個參數我需要的,因爲我將它們傳遞給(max)

回答

6

您可以考慮使用apply(雖然被警告,這可能對於施加限制元素的數量/參數是可以接受的,這取決於你的實施方案):

(apply max '(3 4 2 1 78 2 1)) 

在一般情況下,如果不知道元素的數量要小,它可能是更安全的手動做到這一點:

(define max* (list) 
    (if (null? list) (negative-infinity) 
     (let loop ((list (cdr list)) (best (car list))) 
      (if (null? list) best (loop (cdr list) (max best (car list))))))) 
+0

'apply'正是我一直在尋找對於。謝謝。 – ray 2011-05-15 22:57:18

1

使用基本應用轉化爲運行(max 3 4 2 1 78 2 1)但參數的過程可以通過數量不是無限在某些系統上。對於max,您可以通過使用倍利用其可交換性:

(fold-left max -inf.0 '(3 4 2 1 78 2 1)) 
0

可以編寫的第一個項目比作第二個程序,

(define (largestele lst) 
     (if (null? (cdr lst)) 
      (car lst) 
      (if (> (car lst) (cadr lst)) 
       (largestele (cons (car lst) (cddr lst))) 
       (largestele (cdr lst))))) 
相關問題