2015-10-29 2 views
1

Я хочу предисловие к этому, сказав, что да, это проблема домашних заданий, над которой я работаю, и я не хочу ответа на этот вопрос, просто, возможно, толчок в правильном направлении. Anyhoo, я занимаюсь классом по структурам языков программирования, и один из наших проектов состоит в том, чтобы написать множество небольших программ в lisp. Это требует, чтобы пользователь вводил список и атом, а затем удалял все экземпляры атома из списка. Я просмотрел интернет и не нашел много хороших ресурсов, поэтому я обращаюсь ко всем вам.Удалить определенный элемент в списке?

В любом случае, наш профессор дал нам очень мало в порядке вещей, и очень мало я имею в виду практически ничего.

Это то, что у меня есть до сих пор, и оно не работает.

(defun removeIt (a lis) 
    (if (null lis) 0 
     (if (= a (car lis)) 
      (delete (car lis)) 
      (removeIt (cdr lis))))) 

И когда я типа (removeIt 'u '(u e u e)) в качестве входных данных, он дает мне ошибку о том, что получил 1 аргумент, когда он хотел 2. Какие ошибки я делаю?

ответ

0

Это хороший случай для рекурсивной функции. Предположим, что уже существует функция my-remove, которая принимает атом и список в качестве аргументов и возвращает список без данного атома. Поэтому (my-remove 'Y' (XYZ)) => '(XZ) Теперь, как бы вы использовали эту функцию, если вместо списка (XYZ) у вас есть другой список, который является (AXYZ), т.е. с элементом А впереди? Вы бы сравнили A с вашим атомом, а затем, в зависимости от того, соответствует ли элемент A вашему атому, вы добавите этот элемент A или не к результату применения удаления к остальной части списка. С помощью этой рекурсии функция my-remove будет называться последовательно с более короткими списками. Теперь вам нужно только подумать о базовом случае, то есть о том, что функция my-remove должна вернуть, когда список пуст.

4

Во-первых, несколько косметических изменений:

(defun remove-it (it list) 
    (if (null list) 0 
     (if (= it (car list)) 
      (delete (car list)) 
      (remove-it (cdr list))))) 

Описательные и естественные имена идентификаторов звучащий являются предпочтительными в обществе CL. Не стесняйтесь использовать такие имена, как list. CL имеет несколько пространств имен, поэтому вам не нужно слишком беспокоиться о столкновениях. Используйте дефис вместо верблюжьего футляра или подчеркивания. Кроме того, read a short style guide.

Вы сказали, что вы не хотите, чтобы ответ, но полезные советы, так что здесь мы идем:

  • Проверьте базу случае - ваш результат будет список, так почему бы вам возвращают номер?

  • Используйте подходящую функцию сравнения - = предназначено только для цифр.

  • Вы строите новый список результатов, поэтому ничего не нужно, чтобы delete ничего - просто не добавляйте к нему то, что вы не хотите.

    • Но помните, чтобы добавить, что вы хотите - построить свой список по cons ING то, что вы хотите, чтобы в результате применения вашей функции к остальной части списка.

    • Если вы не хотите сохранять элемент, просто продолжайте применять свою функцию к остальной части списка.

  • Вы определили свою функцию, чтобы взять два аргумента, но вы вызываете его только (cdr list). Укажите отсутствующий аргумент.

Я рыскал по интернету и не нашли все, что много хороших LISP ресурсов,

О, перестань.

Во всяком случае, я рекомендую Touretzky.

Кстати, функция, которую вы пытаетесь осуществить это built-in, но ваш профессор, вероятно, не будет принимать его в качестве решения, и делать это самостоятельно хорошее упражнение. (Для дополнительного кредита попробуйте решить его для вложенных списков.)

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