我在方案中设置了一个程序,它将分析列表并在列表为奇数时返回中间索引,并在列表为偶数时返回中间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)
作为第一个参数传递给整数余数的对象(1 2 2 3 3 3 4 5)不是正确的类型。
编辑:好的,是的,我完全忽略了(even? (length lst))
部分。我目前正在调试助手。
答案 0 :(得分:2)
对于初学者来说,这一行是错误的,列表不能甚至:
(if (even? lst)
但是,列表的长度是另一回事:
(if (even? (length lst))
此外,在两个程序中,确定列表的中间点是否已达到的比较是错误的,您必须在两个辅助程序中调整此行,因为当前不起作用:
(if (= times_carred ...
如果您在times_carred
中启动1
并将条件更改为(>= times_carred (/ (length lst) 2))
,则会更简单,相同的比较适用于这两种情况。