Программа, преобразующая префиксную запись в инфиксную - Lisp

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите с написанием программы, пожалуйста. Задание: Напишите программу, которая преобразует префиксную запись арифметического выражения в инфиксную с учетом того, что знак умножения может быть опущен. Заранее благодарю!

Решение задачи: «Программа, преобразующая префиксную запись в инфиксную»

textual
Листинг программы
(defun f (w)
  (when w (if (atom w) w (infix w))))
 
(defun infix (w &optional ac (p (car w)) (d (cdr w)))
   (if (cdr d)
       (infix (cdr d) (nconc ac (list (f (car d)) p)) p (cdr d))
       (nconc ac (list (f (car d))))))
 
> (infix '(* (+ 3 4 6) (- 1 2 3) 8 9))
((3 + 4 + 6) * (1 - 2 - 3) * 8 * 9)

Объяснение кода листинга программы

В коде представлена функция преобразования префиксной записи в инфиксную.

  1. Функция f принимает один аргумент w и проверяет, является ли он атомом. Если это так, она возвращает его. В противном случае она вызывает функцию infix с аргументами w, ac, p и d, где ac — результат вызова функции f для первого элемента списка w, p — результат вызова функции f для последнего элемента списка w, а d — остаток списка w.
  2. Функция infix принимает аргументы w, ac, p и d. Если d не является пустым списком, она вызывает функцию infix рекурсивно для cdr d с аргументами ac, p и d, с добавлением результата вызова функции f для car d в ac. Затем она добавляет результат вызова функции f для car d в ac. Если d пуст, она возвращает ac.
  3. Вызывается функция infix с аргументом '( (+ 3 4 6) (- 1 2 3) 8 9)', где первый элемент списка — '(', второй элемент списка — '(+ 3 4 6)', третий элемент списка — '(- 1 2 3)', и четвертый элемент списка — '8 9)'.
  4. Функция infix вызывается рекурсивно для cdr аргумента, который является списком '(+ 3 4 6)', с аргументами ac, p и d, где ac — пустой список, p — результат вызова функции f для '3', а d — остаток списка '(+ 4 6)'.
  5. Функция infix вызывается рекурсивно для cdr аргумента, который является списком '(+ 4 6)', с аргументами ac, p и d, где ac — результат вызова функции f для '3', p — результат вызова функции f для '4', а d — остаток списка '6'.
  6. Функция infix вызывается рекурсивно для cdr аргумента, который является списком '6', с аргументами ac, p и d, где ac — результат вызова функции f для '3', p — результат вызова функции f для '4', а d — результат вызова функции f для '6'.
  7. Функция infix вызывается рекурсивно для cdr аргумента, который является пустым списком, с аргументами ac, p и d, где ac — результат вызова функции f для '3', p — результат вызова функции f для '4', а d — результат вызова функции f для '6'.
  8. Результатом является список '((3 + 4 + 6) (1 - 2 - 3) 8 * 9)', который выводится на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы