Инструменты пользователя

Инструменты сайта


examination:flp:question30

Циклические вычисления: предложение DO в РС – Лиспе.

Самым общим циклическим или итерационным предложением в Коммон Лиспе является DO. Предложение DO имеет следующую форму: 

(DO ((varl знач1 шаг1) (var2 знач2 шаг2) ...) (условие-окочания форма11 форма12 ...) форма21 форма22 ...) 

Первый аргумент предложения описывает внутренние переменные varl, var2, …. их начальные значения знач1, знач2, …. а также формы обновления шаг1,  шаг2,… Вычисление предложения DO начинается с присваивания значений переменным формы. Переменным, начальное значение которых не задано, присваивается по умолчанию NIL. В каждом цикле после присваивания значения переменным вычисляется условие окончания. Как только значение условия не равно NIL, т.е. условие окончания истинно, последовательно вычисляются формы форма1і, и значение последней формы возвращается как значение всего предложения DO. В противном случае последовательно вычисляются формы форма2і из тела предложения DO. На следующем цикле переменным vari присваиваются (одновременно) значения форм шагі, вычисляемых в текущем контексте, проверяется условие окончания и т.д. Если для переменной не задана форма, по которой она обновляется, то значение переменной не меняется. Для примера с помощью предложения DO определим функцию, вычисляющую n-ю степень числа (n - целое, положительное): 

_(defun exptl (х n) 
       (do ((результат 1) ; начальное значение 
           ((= n 0) результат) ; условие окончания 

                   (setq результат (* результат х)) 
                   (setq n (- n 1)))) 



(exptl 2 3) 

Идея определения состоит в том, чтобы умножить X на себя N раз, что и является N-й степенью числа X. В каждом цикле значение переменной РЕЗУЛЬТАТ умножается на X до тех пор, пока значение счетчика N не уменьшится до 0 и конечное значение переменной РЕЗУЛЬТАТ можно будет выдать в качестве значения предложения ЕЮ. 

Так как в предложении DO можно совместно с переменными описать и закон их изменения, то функцию EXPT1 можно было бы задать и такой формой: 

(defun ехр12 (x n) 
         (do ((результат х (* результат х)) (разы n (- разы 1))) ((= разы 1) результат))) ; условие окончания 

В этом определении нет вычисляемого в цикле тела предложения DO, присутствуют только описания переменных, законов их изменения и условие завершения.

examination/flp/question30.txt · Последние изменения: 2014/01/15 12:17 (внешнее изменение)