0

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

(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),我收到一条错误消息,说我用错误数量的参数调用了该过程。

4

2 回答 2

2

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

最后一个if也没有相应的else部分,这可能会在某些解释器中引发错误(无论如何,在cond这里使用 a 会更好),最后一个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
于 2013-11-06T22:26:59.230 回答
1

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

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

于 2013-11-06T22:18:45.370 回答