|
Алгоритм решения
не столь элегантен, и не содержит проверку на переполнение при
умножении, но он выглядит удовлетворительно для значений N от 1
до 7.
Листинг 2-7. Решение проблемы рекурсии для вычисления
факториала
-----------------------------------------------------------------
factor PROC NEAR ; нахождение факториала числа N
cmp ax,2 ; уже достигнут конец?
jne subfact ; нет, вычисление (N - 1)!
mov ax,2 ; да, выполнение сначала
ret
subfact:
push ax ; сохранение текущего значения N
sub ax,1 ; получение N - 1
call factor ; запрос (N - 1)!
pop bx ; восстановление значения N
mul bx ; N x (N [min]-1)! = N!
ret
factor ENDP
-----------------------------------------------------------------
Повторно-входимый код - необходимое условие локальной памяти
Во всех вышеперечисленных случаях данные программы должны
храниться отдельно от ее программного кода так, чтобы несколько
процедур, каждая с ее собственными областями данных, могли бы вы-
полнять программный код в одно и то же время. Если встретился
этот критерий, то говорят, что программа повторно-входимая (пов-
торно-используемая). Т.е. программа может быть вызвана (введена)
при одном программном потоке, пока все еще выполняется другой
программный поток. Слова "программный поток" указывают на то, что
неважно, вызвана ли программа другой программой, или она вызвала
сама себя (рекурсия).
В действительности, данные, подлежащие сохранению, сохраняют-
ся в стеке вызывающей программы. Это возможно только при рекур-
сии, поскольку программист знает, когда управление передается в
новую программу, и может предвидеть необходимость установки новой
области данных. Для многопользовательских прикладных программ и
прикладных программ обработчиков-прерываний это не является дос-
таточным и программы должны иметь свои данные, защищенные все
время. Управление в такие программы может быть передано в любое
время. В этих случаях устанавливайте локальную область данных,
когда программа вводится в первый раз.
|