/----------------
| Приемы кодинга |
----------------/
Экскурсия в рекурсию (ц)Радиолюбитель ВК
И так, что за зверь такой рекурсия и с
чем его едят ? Рекурсия- ето есть вызов
программой сямой себя. Значит простейшая
рекурсия- 10 GO SUB 10 .
Однако из рекурсии должен быть какойлибо
выход, иначе какой же тогда в ней смысл ?
Кстати, забыл сказать, что переменные моей
процедуры не мои переменные (ц)Кто-то из
великих.Обыдно, но в васике нету такой
фигни, которая сохраняла бы переменные, по
этому перейдем на ПАСЦАЛ.
Program recursion;
Procedure rec(n:integer);
Begin
If n>1 then rec(n-1);
WriteLn(n)
End;
(* Main *)
Begin
Rec(10)
End.
Результат: 10 9 8 7 6 5 4 3 2 1
Но ПАСЦАЛ потому и ПАСЦАЛ, что даже на
писюке на нем ничего на делают, и по этому
перейдем на ассемблер.
"Рекурсия на ассемблере ??? %-|",- Спро-
сите вы. "Ага, а почему бы и нет",- отвечу
я. Нет ничего невозможного. Для примера и
для продолжения темы приведу вам маленькую
библиотечку печати.
Точка входа: BPR, номер функции в гС.
Let's go !
BPR PUSH ВС,DE,HL,AF
LD A,С
СР 1
JR NZ,BPR0
POP AF
PUSH AF
RST #10
BPR_ POP AF,HL,DE,ВС
RET
BPR0 СР 2
JR NZ,BPR1
LD A,22
LD С,1
CALL BPR ;А ВОТ ТЕ И РЕКУРСИЯ
LD A,D
CALL BPR
LD A,Е
JR BPR
BPR1 LD A,(HL)
AND (HL)
JR Z,BPR_
LD С,1
CALL BPR
JR BPR1
1:Печать символов. A = символ.
2:Установка печати. В D = X, Е = Y.
3:Печать текста, в HL = адресс текста,
0 - маркер конца.
Похоже, это все :)
Other articles: