Вернуть список символов из смешанного списка - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь написать функцию на Лиспе, которая возвращает список символов (без повторов) из списка (с целыми числами, символами и т. Д.). Я все еще новичок в Lisp и у меня проблемы с запуском. Наш проф упомянул об использовании атома, но я не могу понять, что она имела в виду. Вот вопрос:

"Напишите функцию lisp, которая принимает список в качестве входного аргумента (список состоит из целых чисел, десятичных дробей, символы и вложенные списки) и создает список, включающий все символы в исходном списке без каких-либо дублирования. Пример вывода программы показан ниже:

  1. ‘((z f) (b a 5 3.5) 6 (7) (a) c) -> (z f b a c)
  2. ‘((n) 2 (6 ч 7,8) (w f) (n) (c) n) -> (h w f c n)"

1 Ответ

0 голосов
/ 30 октября 2018

То, что ваше назначение называет «символами», на самом деле является символами с именем длины 1. Кажется, что вы можете просто мысленно заменить слово «символы» на «символы» и работать с этим.

Атом - это все, что не является минусом - любой непустой список состоит из цепочки конусов. Например, символы, числа, строки и nil являются атомами.

Минусы (на самом деле минусы) - это простая структура данных, которая может содержать две вещи. В списке первое, что есть у каждого минуса, это какой-то элемент списка, а второй - указатель на следующий минус или ноль. Вы также можете иметь списки в качестве элементов списка; тогда также первым делом будет указатель на список. Тогда это будет формально дерево. Функция доступа для первой вещи «против» называется car или first, функция доступа для другой вещи называется cdr или rest. Car и cdr немного архаичны, и в основном используются, когда вы видите cons-ячейку как узел дерева, в то время как first и rest более современные, и в основном используются, когда вы видите cons-ячейку как список звено цепи.

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

Ваше задание состоит из нескольких частей:

  • Пройдите по дереву, чтобы посмотреть на каждый элемент. Это может быть сделано с помощью рекурсии или с помощью цикла в одном направлении и рекурсии в другом.
  • Храните список символов, которые вы уже нашли.
  • Если элемент, на который вы смотрите, является символом (с именем длиной 1…), то проверьте, является ли он новым, если да, добавьте его в свой список.
  • Наконец, верните этот список.

Одна полезная идиома - использовать push или pushnew, которые ставят новые элементы в начало списка, а в конце reverse it.

...