ціле позитивне):
(defun expt (х n)
(do ((результат 1)); початкове значення
((= n 0) результат); умова закінчення
(setq результат (* результат х))
(setqn (^ nl))))
Результат завдання функції: EXPT.
Приклад виклику:
(expt 2 3)
Результат: 8.
Ітеративні (циклічні) і рекурсивні програми теоретично однакові за своїми обчислювальним можливостям, однак властивості ітеративних і рекурсивних варіантів програм можуть істотно різнитися. Рекурсивні програми більш короткі та змістовні. Особливо корисно використовувати рекурсію в тих випадках, коли можна вирішити завдання і обробляються дані по своїй суті рекурсивно, наприклад, при обробці списків, так як списки можуть рекурсивно містити підсписки, при роботі з іншими динамічними структурами, які заздалегідь не повністю відомі. Рекурсивні процедури грають найважливішу роль майже у всіх програмах, пов'язаних з штучним інтелектом. p align="justify"> ВВЕДЕННЯ-ВИВЕДЕННЯ ДАНИХ
Досі розглядався введення і виведення даних у лісповскіх програмах через параметри функцій та вільні змінні. Для організації діалогу людини з програмою в Ліспі існують спеціальні функції READ і PRINT. p align="justify"> Для виведення результатів можна використовувати функцію PRINT. Це функція з одним аргументом, яка спочатку обчислює значення аргументу, а потім виводить це значення. p align="justify"> Наприклад:
(PRINT (* 2 лютого))
Результат: 4.
Перед висновком відбувається перехід на новий рядок.
Функція READ читає і повертає вираз: (READ). Як тільки інтерпретатор зустрічає таку пропозицію, обчислення призупиняються до тих пір, поки не буде введений небудь символ або цілком вираз. Аргументів у функції READ немає, її використання побудовано на побічну ефекті, що складається саме у введенні виразу. Прочитане вираз можна зберегти для наступного використання та обробки, наприклад, так:
(setq input (read));
прочитане READ вираз присвоюється змінної input.
Лісповскіе оператори введення-виведення дуже гнучкі, їх можна використовувати як аргументи інших функцій. Для більш естетичного оформлення висновку можна використовувати функції PRINC, друкувальну рядок без оздоблюють лапок і з спеціальними символами, а також TERPRI, що переводить рядок. p align="justify"> Для форматного виводу (відповідно з деяким чином) існує функція FORMAT, що володіє гнучкими можливостями, описаними в посібниках з мови Лісп.
Крім стандартних пристроїв введення-виведення, може здійснюватися обробка файлів на магнітних носіях, завантажуватися з файлів визначення функцій і т.д.
ПРИКЛАД ПРОГРАМУВАННЯ НА Ліспі
Розглянемо як приклад програмування на Ліспі менш елементарну класичну задачу, що носить назву гри в В«ханойські вежіВ».
Гра полягає в наступному. Використовуються три вертикальних стрижня А, В, С і набір N дисків різного діаметру з отвором посередині (так що їх можна надягати на стрижні). У початковому положенні всі диски надіті на стрижень А по порядку убування діаметрів: внизу найбільший, над ним - трохи менше і т.д., а нагорі - найменший. Метою є перенесення всіх дисків зі стрижня А на стержень У за такими правилами:
) за один раз можна перенести тільки один диск;
) більший за розміром диск не можна покласти на менший;
) третій стрижень С можна використовувати як допоміжний. Алгоритм розв'язання задачі можна представити у вигляді трьох наступних рекурсивних підзадач:
) перенести із стержня А N-1 дисків на допоміжний стержень С;
перенести нижній диск із стержня А на стержень В;
перенести із стержня З N-1 дисків на стрижень В.
Програма складається з трьох послідовно обумовлених функцій В«ханойські-вежіВ», В«перенесенняВ», В«виведиВ» і має вигляд:
Програма 130
(defun ханойські-вежі (висота)
(рrоgn (перенесення "а" Ь "з висота)" готове))
Ханойська-БАШНИ
(defun перенос (з в допоміжний n)
(cond
((= п 1); гілку 2
(виведи з в) (t (перенесення з; ветвь1 допоміжний
в
(- n 1))
(виведи з в)
(перенесення допоміжний; гілку 3
...