2016-12-04 65 views
1

我有这样的代码:计划 - 在列表中插入数

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

我想这个代码,以列表(假设它是在低增长的整数的顺序),并在正确的位置插入一个数字。此代码不起作用,但我不知道为什么。有人知道吗?

+0

这里有一个根本的错误,就是你构建输出列表的方式。使用'cons',参考你的教科书。 –

回答

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的值将被丢弃,因为它们不是嵌套的(在过程中,只返回上一个表达式的值)。当你写if•不用相应else部分
  • 在第二个条件的一些计划口译甚至会引发错误,您必须通过cons用列表的其余部分荷兰国际集团的value停止递归。最好是尽快,当元素> =值停止,如果有重复的元素
  • 在最后一个条件,你传递的参数顺序错误,并且忘记了value
  • 此外,在最后一个条件,你忘了cons当前元素
+0

正在使用cond和其他必要的? –

+0

@ A.L否,或者你可以嵌套'if's。这是丑陋的,但工程。你需要确保的是条件是相互排斥的 –

+0

如何使用cons?我只有使用append的经验。会在这种情况下追加工作吗?或者缺点是必要的 –

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

+0

感谢您的意见 –