我有这段代码:
(define (Insert value list)
(if (null? list) (list value))
(if (< value (car list)) (list (Insert (value list))))
(Insert (cdr list) list))
我希望此代码采用一个列表(假设它处于低位到整数的递增顺序)并在正确的位置插入一个数字。这段代码不起作用,但我不知道为什么。有人知道吗?
答案 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
构造返回值。