Scheme - 在List中插入数字

时间:2016-12-04 23:08:20

标签: scheme

我有这段代码:

(define (Insert value list)
  (if (null? list) (list value))
  (if (< value (car list)) (list (Insert (value list))))
  (Insert (cdr list) list))

我希望此代码采用一个列表(假设它处于低位到整数的递增顺序)并在正确的位置插入一个数字。这段代码不起作用,但我不知道为什么。有人知道吗?

2 个答案:

答案 0 :(得分:2)

你有很多错误。首先,让我们看看如何修复您的实施:

(define (insert value lst)
  (cond ((null? lst)          ; if the list is empty
         (list value))        ; then return a single-element list
        ((<= value (car lst)) ; if current element >= value
         (cons value lst))    ; insert value in current position
        (else                 ; otherwise keep building the list
         (cons (car lst)      ; by adding current element
               (insert value (cdr lst)))))) ; and advancing recursion

现在,让我们看看您的代码出了什么问题:

  • 您不能将参数list命名为与同名内置程序冲突的参数 - 您实际使用的参数!很清楚他们会发生冲突
  • 如果您有多个条件使用cond表达式,则条件结构不正确。请注意,前两个if的值被丢弃,因为它们没有嵌套(在过程中,只返回 last 表达式的值)。当您在没有相应的if部分的情况下编写else时,某些Scheme解释器甚至会引发错误
  • 在第二个条件中,您必须通过cons value与列表的其余部分停止递归。当元素&gt; =值时,如果有重复元素,最好立即停止
  • 在最后一个条件中,您以错误的顺序传递参数,忘记了value
  • 同样在最后一个条件中,您忘记了cons当前元素

答案 1 :(得分:1)

您的代码中有多处错误。首先,在Scheme中,为if s包含else子句更为自然。另外,你错了上一个if。以下是您的代码版本,稍作修改:

(define (Insert value lst)
  (if (null? lst) (list value)
      (if (< value (car lst))
          (cons value lst)
          (cons (car lst) (Insert value (cdr lst))))))

请注意,您必须提供值小于列表头部时的操作以及何时不执行操作,并且必须使用cons构造返回值。