我正在尝试制定一个程序,将一个数字连接到一组从小到大排序的数字。在这个集合中,没有重复项,所以我尝试通过检查要连接的数字是否已经等于集合的 car
来递归解决这个问题,如果为真则返回集合返回,如果号码大于集合的car
,则用号码和集合的cdr
再次执行该过程。如果该集合为空,则它会将数字与集合相邻,因为我们知道该数字不等于集合中的任何其他数字。
这是我写的代码:
(define (adjoin-set x set)
(if (null? set)
(cons x set)
(let (x1 (car set))
(cond ((= x x1) set)
((> x x1)(adjoin-set x (cdr set)))
(else (cons x set))))))
我在一组赔率上测试了它:(define odds '(1 3 5)) (adjoin-set 7 odds)
和 the interpreter返回以下内容:错误:让:需要一对绑定(bind):得到 x1 []
。任何人都可以解释为什么会被退回以及如何解决它吗?
最佳答案
let
表达式的语法不正确,缺少几个 ()
。应该是这样的:
(define (adjoin-set x set)
(if (null? set)
(cons x set)
(let ((x1 (car set)))
(cond ((= x x1) set)
((> x x1) (adjoin-set x (cdr set)))
(else (cons x set))))))
您可以在 let
声明中定义多个变量/值对,最外层的括号用于将它们组合在一起。
关于set - 为什么我在 Scheme 中的 adjoin-set 过程会返回错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55799864/