私はSchemeを初めて使い、壁に当たった。私はソートと平均関数を持っており、私はこのサイトで見つかった関数の中央値を変更しようとしています。しかし、何を試しても、メディアン関数に複数の式がある場合はエラーが発生します。メディアン関数でソートを使用しようとすると、「未定義」になります。スキーム - ユーザー定義ソートと平均関数を使用してメジアンを見つける方法
(define (sort1 L)
(if (or (null? L) (<= (length L) 1)) L
(let loop ((l null) (r null)
(pivot (car L)) (rest (cdr L)))
(if (null? rest)
(append (append (sort1 l) (list pivot)) (sort1 r))
(if (<= (car rest) pivot)
(loop (append l (list (car rest))) r pivot (cdr rest))
(loop l (append r (list (car rest))) pivot (cdr rest)))))))
(define (avg lst)
(let loop ((count 0) (sum 0) (args lst))
(if (not (null? args))
(loop (add1 count) (+ sum (car args)) (cdr args))
(/ sum count))))
(define (median L)
(if (null? L) (error "The list is empty")
(let loop ((L1 L) (L2 L))
(cond ((null? (cdr L2)) (car L1))
((null? (cddr L2)) (list (car L1) (cadr L1)))
(else (loop (cdr L1) (cddr L2)))))))
私は最初のリストをソートするために、中央値関数を編集しようとしている、と偶数の要素が存在する場合、私はリストの平均を取り、平均値に最も近い要素を使用する必要があります。
ご協力いただきますようお願い申し上げます。ありがとうございます。
多くの基本的なかっこのエラーがあります。たとえば 'median'の定義では、最初の' let'の前に2つの括弧があります。これはおそらく意図していなかったでしょうし、 '(sort1 lst)'の後に2つの括弧もあります。つまり 'let'体が欠けている。それで、あなたはまた、 'let loop'の前にparenがありません。それらを最初に修正してから、本当の質問をしてください。カッコは通常、関数の適用を意味することに注意してください。 –
関数を元のコードに戻しましたが、関数は今では機能するので修正する必要があります。リストの入力をソートする必要があります。リストに偶数の要素が含まれていれば、要素)の平均値を計算します。 –
あなたが1つのことをしたい場合は、もう1つ、それは機能の構成です。だから、リストをソートしてから、このメディアン関数を適用したいのですか?メジアン関数の名前を 'median/sorted'に変更し、実際の' median'関数を 'sort1'と' median/sorted'の合成として定義します。 –