Как заменить число во вложенном списке на символы?
-
28-10-2019 - |
Вопрос
Похоже, мне нужно подробно рассказать об этом; это моя домашняя работа. Я не хотите скопировать написанный вами код. Я новичок; что я пытаюсь научиться разбирать предмет на отдельные части, а затем сконцентрируйтесь на том, какую функцию мне следует использовать для решения проблемы. Это немного сложно решить эти проблемы самостоятельно, потому что я полностью новичок в Lisp, собственно в том, как программировать. Я надеюсь, что вы можете помочь мне из.
Вот проблема: есть заданная константа
родовое словоКаждый шторм представлен списком с его названием и скоростью ветра.
Скорости ветра подразделяются на следующие категории:
39–74 → сгенерировать кодовый код
75–95 → генерировать кодовый код
96–110 → генерировать кодовый код
111–130 → генерировать кодовый код
131–155 → генерировать кодовый код
156 или более → tropical
Теперь мне нужно написать две функции:
-
cat-1
должен генерировать названия категорий, например:cat-2
,cat-3
,… -
и
cat-4
должны генерировать количество штормов в каждой категории, например:cat-5
,storm-categories
,…
Я пытаюсь решить эту проблему следующим образом:
-
Используйте операторы сгенерированного кода, чтобы судить о типе скорости ветра:
(if (and (> x 39) (
x 74) ( x 96) ( x 111) ( x 131) ( x 156)) (print 'cat-5)) -
Замените скорость ветра (например,
(bob tropical)
) на windtype (например,(chary cat-1)
)(цикл для x в штормах do (rplacd x ‘windtype)
У меня есть простое представление о первой функции, но я все еще не знаю как это реализовать. Я не касался функции распределения, потому что я все еще застрял на первом.
Решение
Хорошо, Рочча, вы опубликовали свой ответ. Вот мой взломанный через несколько минут, но он должен дать вам несколько идей:
Сначала начнем с данных:
родовое словоФункция, которая проверяет, находится ли значение между двумя границами. Если правая граница также может отсутствовать (NIL).
родовое словоОбратите внимание, что Lisp допускает предикат сравнения с более чем двумя аргументами.
Давайте определим категорию шторма. Функции Lisp, FIND
и FIND-IF
находят элементы в списках.
Давайте вычислим категорию для каждого шторма. Поскольку мы получаем список (скорость штормового ветра), мы просто сопоставляем функцию, которая вычисляет категорию по списку. Нам нужно вернуть список штормов и категории.
родовое слово Теперь мы берем тот же список штормов, но используем хеш-таблицу, чтобы отслеживать, сколько штормов было в каждой категории. MAPC
похож на MAPCAR
, но только для побочного эффекта обновления хеш-таблицы. ÌNCF увеличивает счетчик. Когда мы заполнили хеш-таблицу, нам нужно отобразить ее с помощью MAPHASH
. Для каждой пары ключ и значение в таблице мы просто помещаем пару в список результатов, а затем возвращаем этот результат.
Тест:
родовое словоМне нравится.
Другие советы
DEFCONSTANT неверно. Нет смысла делать ваш ввод постоянным. Переменная, определенная с помощью DEFVAR или DEFPARAMETER, подходит.
Вместо IF используйте COND. COND позволяет тестировать несколько условий.
Вы не хотите использовать PRINT. Зачем что-то печатать. Вы хотите вычислить значение.
РПЛАКА тоже ошибается. Это используется для деструктивной модификации. Вы этого не хотите. Вы хотите создать новую ценность. Что-то вроде RPLACA можно использовать в функции DISTRIBUTION (см. Ниже).
Используйте функциональную абстракцию. Какие функции полезны?
-
МЕЖДУ-P, находится ли значение X между a и b?
-
КАТЕГОРИЯ ШТУРМА, для заданной скорости ветра вернуть категорию
-
КАТЕГОРИИ ШТОРМА: для списка элементов (скорость штормового ветра) возвращает список элементов (категория шторма). Наведите курсор на список ввода, чтобы создать список результатов.
-
РАСПРЕДЕЛЕНИЕ, для списка элементов (категория тега) возвращает список с элементами (количество тегов категории в этой категории).
-
ШТОРМ-РАСПРЕДЕЛЕНИЕ, для списка элементов (категория шторма) возвращает список с элементами (категория количество-штормов в этой-категории). Это в основном вызывает DISTRIBUTION с правильными параметрами.
Функция РАСПРЕДЕЛЕНИЕ - самая сложная из перечисленных. Обычно можно использовать хеш-таблицу или связанный список в качестве промежуточной помощи для подсчета вхождений. Сопоставьте список ввода и обновите соответствующий счетчик.
Также: хорошее введение в основы Lisp - это книга Common Lisp: A Gentle Introduction to Символическое вычисление - это бесплатно в формате PDF для загрузки. Более увлекательным и базовым введением в Лисп является книга Land of Lisp .
Наконец-то решена эта проблема.вторая часть действительно сводит меня с ума.Я не могу понять, как использовать хеш-таблицу или связанный список, чтобы его полюбить.В любом случае задание выполнено, но я хочу знать, как его упростить ... Надеюсь, вы, ребята, сможете мне помочь .Спасибо за помощь, Джосвинг, твоя идея мне очень помогает ...
родовое слово