找不到这个代码(方案)的错误

时间:2013-11-06 22:03:18

标签: list scheme set

我正在编写一个以线性时间运行的过程,它返回任何不属于两个集合的数字。我目前的代码是

(define (set-diff setA setB)
    (define (iter A B result)
        (if (or (null? A) (null? B))
            (reverse result)
            (if (>= (car A) (car B))
                (iter (cdr A) (cdr B) '() )
                    (if (<  (car A) (car B))
                    (cons (car B) result (iter (cdr A) (cdr B) '() ))))))
(iter setA  SetB '())) 

持续出现的问题是,当运行此函数时,通过任意测试用例(set-diff '(1 5 7 9) '(1 7 8 9 10)) ; (5),我收到一条错误消息,说我用错误的参数数调用了该过程。

2 个答案:

答案 0 :(得分:2)

问题中没有说明,但看​​起来输入集是排序的,输出集也必须排序。如果是这种情况,那么问题中的代码远非正确,你没有考虑所有情况,递归推进的方式是不正确的,结果的构建方式也是错误的。

最后一个if也没有相应的else部分,这可能会在某些解释器中引发错误(无论如何,使用cond更好一点在这里),最后一个cons正在接收三个参数而不是正确的两个参数(顺便说一下,这导致报告错误),最后传递给iter的参数与接收到的参数不同程序(如果口译员考虑到案件的情况,这可能是也可能不是问题)。该函数需要完全重写才能工作:

(define (set-diff setA setB)
  (define (iter A B result)
    (cond ((null? A) (append (reverse result) B))
          ((null? B) (append (reverse result) A))
          ((< (car A) (car B))
           (iter (cdr A) B (cons (car A) result)))
          ((> (car A) (car B))
           (iter A (cdr B) (cons (car B) result)))
          (else (iter (cdr A) (cdr B) result))))
  (iter setA  setB '()))

(set-diff '(1 5 7 9) '(1 7 8 9 10))
=> '(5 8 10) ; this is the correct answer for the sample input

答案 1 :(得分:1)

倒数第二行的cons有三个参数,但应该只有两个。

您在两个地方拼写setBSetB的方式不同,这可能会导致某些Scheme系统出现问题。