繁体   English   中英

找不到此代码有什么问题(方案)[关闭]

[英]Can't find whats wrong with this code (scheme) [closed]

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

(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) (set-diff '(1 5 7 9) '(1 7 8 9 10)) ; (5) ,我收到一条错误消息,提示我调用了错误数量的参数的过程。

它没有在问题中说明,但看​​起来输入集已排序,输出集也必须排序。 如果真是这样,那么问题中的代码就很不正确,您没有考虑所有情况,递归进行的方式不正确,结果生成的方式也不正确。

同样,最后一个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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM