我正在编写一个以线性时间运行的过程,它返回任何不属于两个集合的数字。我目前的代码是
(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)
,我收到一条错误消息,说我用错误的参数数调用了该过程。
答案 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
有三个参数,但应该只有两个。
您在两个地方拼写setB
和SetB
的方式不同,这可能会导致某些Scheme系统出现问题。