Как заменить число во вложенном списке на символы?

StackOverflow https://stackoverflow.com/questions/7368882

  •  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,…

Я пытаюсь решить эту проблему следующим образом:

  1. Используйте операторы сгенерированного кода, чтобы судить о типе скорости ветра:

    (if (and (> x 39) ( x 74) ( x 96) ( x 111) ( x 131) ( x 156)) (print 'cat-5))

  2. Замените скорость ветра (например, (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 .

Наконец-то решена эта проблема.вторая часть действительно сводит меня с ума.Я не могу понять, как использовать хеш-таблицу или связанный список, чтобы его полюбить.В любом случае задание выполнено, но я хочу знать, как его упростить ... Надеюсь, вы, ребята, сможете мне помочь .Спасибо за помощь, Джосвинг, твоя идея мне очень помогает ...

родовое слово
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top