[英]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
有三个参数,但只能有两个。
您还会在两个地方对setB
和SetB
不同的拼写,这可能会导致某些Scheme系统出现问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.