2016-12-04 3 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 s отбрасываются, поскольку они не являются вложенными (внутри процедуры возвращается только значение )). Некоторые толкователи Scheme даже вызвать ошибку при написании if сек без соответствующего else части
  • Во втором состоянии, вы должны остановить рекурсию по cons ING в value с остальной частью списка. Это лучше, чтобы остановить как можно скорее, когда элемент> = значение, в случае, если существуют повторяющиеся элементы
  • В последнем состоянии, вы передаете параметры в неправильном порядке, и забыл о value
  • Также в последнее условие, вы забыли cons текущий элемент
+0

Использует cond и еще что необходимо? –

+0

@ A.L no, иначе вы можете вложить 'if's. Это уродливо, но работает. Что вы должны убедиться, что условия взаимоисключающие –

+0

Как насчет использования минусов? У меня есть опыт использования append. Будет ли добавлена ​​работа в этом случае? Или требуется минус –

1

У вас есть несколько ошибок в коде. Во-первых, в схеме более естественно включать предложения else для if s. Кроме того, у вас был неправильный последний 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

спасибо за ввод –

Смежные вопросы