4

長さが異なる数の事前定義された(max)関数(R5RS)を使用したいと思います。list残念ながら、(max)次のような入力を受け入れます。

(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)ですか?

4

3 に答える 3

6

使用を検討することapplyもできます(ただし、Schemeの実装によっては、許容できる要素/引数の数に関して制限が課される場合があることに注意してください)。

(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)))))))
于 2011-05-15T21:12:31.247 に答える
1

applyを使用すると、基本的に実行に変換されます(max 3 4 2 1 78 2 1)が、一部のシステムでは、プロシージャに渡すことができる引数の数は無限ではありません。の場合max、foldを使用してその可換性を利用できます。

(fold-left max -inf.0 '(3 4 2 1 78 2 1))
于 2011-05-20T02:06:46.800 に答える
0

最初の項目を2番目の項目と比較するプロシージャを記述できます。

(define (largestele lst)
        (if (null? (cdr lst))
            (car lst)
            (if (> (car lst) (cadr lst))
                (largestele (cons (car lst) (cddr lst)))
                (largestele (cdr lst)))))
于 2013-04-28T20:56:39.423 に答える