0

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

4

1 回答 1

2

对于初学者来说,这一行是错误的,一个列表不能是偶数

(if (even? lst)

然而,列表的长度是另一回事:

(if (even? (length lst))

此外,在这两个程序中,用于确定是否已达到列表中点的比较是错误的,您必须在两个辅助程序中调整此行,因为目前无法正常工作:

(if (= times_carred ...

如果您开始并将条件更改为会更简单times_carred,相同的比较适用于两种情况。1(>= times_carred (/ (length lst) 2))

于 2013-10-29T23:15:33.520 回答