这段代码出了什么问题? (方案)

时间:2013-10-29 23:11:07

标签: object types scheme

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

1 个答案:

答案 0 :(得分:2)

对于初学者来说,这一行是错误的,列表不能甚至

(if (even? lst)

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

(if (even? (length lst))

此外,在两个程序中,确定列表的中间点是否已达到的比较是错误的,您必须在两个辅助程序中调整此行,因为当前不起作用:

(if (= times_carred ...

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