リストを分析し、リストが奇数の場合は中央のインデックスを返し、リストが偶数の場合は中央の 2 つの値の平均を返すスキームのプロシージャを設定しました。これが私が持っているものです(これらのものはそれ自体で完全に正常に動作します):
(define (median-index-odd lst)
(define (median-index-iter1 lst times_carred)
(if (null? lst)
'()
(if (= times_carred (/ (+ (length lst) 1) 2))
(list (car lst))
(median-index-iter1 (cdr lst) (+ 1 times_carred)))))
(median-index-iter1 lst 0))
(define (median-index-even lst)
(define (median-index-iter2 lst times_carred)
(if (null? lst)
'()
(if (= times_carred (/ (length lst) 2))
(list (/ (+ (car lst) (cadr lst)) 2))
(median-index-iter2 (cdr lst) (+ 1 times_carred)))))
(median-index-iter2 lst 0))
これらのヘルパーによる煩雑さを除いた実際の手順は次のとおりです。
(define (median lst)
(if (null? lst)
'()
(if (even? lst)
(median-index-even lst)
(median-index-odd lst))))
ただし、テスト ケースを実行しようとすると、エラーが発生します。
(display (median '(1 2 2 3 3 3 4 5))) (newline)
integer-remainder の最初の引数として渡されたオブジェクト (1 2 2 3 3 3 4 5) は、正しい型ではありません。
編集:わかりました、はい、私はその(even? (length lst))
部分を完全に見落としていました. 現在、ヘルパーをデバッグしています。