Возникли проблемы с вложенным списком CLISP и лямбда-выражением - PullRequest
0 голосов
/ 01 сентября 2011

Вложенные списки в Common Lisp действительно смутили меня.Вот проблема:

Используя рекурсию, пусть (nested-list 'b '(a (b c) d)) возвращает t, если первый аргумент появляется во втором аргументе (который может быть вложенным списком), и nil в противном случае.

Я пытался find, но он работает только в том случае, если первый аргумент '(b c).Я перевел взгляд на лямбда-выражения.Сначала я хочу сгладить второй аргумент, а затем использовать eq для сравнения аргументов.

(defun nested-list (x y)
  (cond     
    ((null y) ())    
    (t (append (lambda (flatten) (first y))

Тогда я застрял.Несмотря на то, что я много читал о лямбда-выражениях, это все равно смутило меня.Я не знаю, как вызвать его, когда мне нужно, я знал функцию funcall, но вы знаете, я просто не могу ее получить.Я только что изучил Common Lisp в течение 5 дней, так что я надеюсь, что вы можете дать мне подсказку.Большое спасибо!

1 Ответ

2 голосов
/ 01 сентября 2011

Прежде всего, если вы не набрали if вместо iff, проблема достаточно тривиальна, просто верните t и все готово: -)

Серьезно говоря, вместо этого, когда вам нужно решитьпроблема с использованием рекурсии, идея часто проста:

  1. , если мы находимся в тривиальном случае, просто вернем ответ
  2. , в противном случае ответ будет таким же, как и при решениипроблема в том, что это немного проще, и мы сами решаем эту упрощенную версию.

В частности, рассмотрим:

  1. Если второй аргументДля пустого списка ответом будет NIL
  2. Если первый аргумент равен первому элементу второго аргумента, просто вернуть T вместо
  3. В противном случае, если первый элемент второгоlist является списком (следовательно, также возможно вложенным списком), и элемент содержится в этом мультилисте, а затем возвращает true (для проверки в этом случае функция вызывает себя)
  4. В противном случае просто chВозьмите ту же проблему, но сначала отбросьте первый элемент второго аргумента, потому что он был проверен (он также вызывает рекурсивно ту же функцию)

Так что в основном 1 и 2 - тривиальные случаи;3 и 4 - случаи, когда вы решаете более простую версию проблемы.

...