为什么我的 Scheme return 中的 adjoin-set 过程出错了?

Why does my adjoin-set procedure in Scheme return an error?

我正在尝试制定一个程序,将一个数字连接到一组从最小到最大排序的数字。在这个集合中,没有重复项,所以我试图递归地解决这个问题,通过检查要连接的数字是否已经等于集合的 car 并且如果返回 true 则返回集合,并且如果数字大于集合的 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 返回了以下结果:Error: let: need a pair for bindings: got 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 声明中定义多个 variable/value 对,最外层的括号用于将它们组合在一起。