我在方案中设置了一个过程,它将分析一个列表并在列表为奇数时返回中间索引,当列表为偶数时返回中间 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))
部分。我目前正在调试助手。