Футкция - так?
...::: Приветствую, Всех :::...
Думаю, думаю, но логически понять так и не могу.
В итоге правильно получается что функция решает факториал так:
Index = 5
1) Result := Index*MulNumber(Index-1)
| | |
20 5 4
2) Result := Index*MulNumber(Index-1)
| | |
60 3 20
3) Result := Index*MulNumber(Index-1)
| | |
120 2 60
4) Result := Index*MulNumber(Index-1)
| | |
120 1 120
Только так я понял как она решает ( и понял зачем в конце стоит
Result:=1 ) факториал, но как цифры "скачут" в первом 1) не ясно.
Ведь если Result := Index*MulNumber(Index-1) то это с логической точки
зрения будет выглядеть так:
Result := Index * MulNumber(index-1)
| | | | | |
1) 0 <- 5 * 4 ( index-1 ) =4
2) 20 <- 4 * 3 ( index-1 ) =3
3) 12 <- 3 * 2 ( index-1 ) =2
4) 2 <- 2 * 1 ( index-1 ) =1
Но ведь эта какая-то ерунда!
Правильно ли я понял то как функция вызывает саму себя (рекурсия)?
index=5
...
? 5 ? 5-1
Result:=Index*MulNumber(index-1);
|
||
... ? ? ? 4-1
Result:=Index*MulNumber(index-1);
|
||
... ? ? ? 3-1
Result:=Index*MulNumber(index-1);
|
||
... ? ? ? 2-1
Result:=Index*MulNumber(index-1);
|
||
... ? ? ? 1-1
Result:=Index*MulNumber(index-1);
Если это правильно, то что происходит дальше?
...::: by GENEMI :::...
Номер выпуска : 4317
Возраст листа : 568 (дней)
Количество подписчиков : 523
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/349122
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Здравствуйте, GENEMI,
Да-а, намутил ты...
Правильно, тебе про это и говорили, только функция вызывает не просто
саму себя, а новую копию себя. Каждый вызов ничего не знает о
предыдущих и последующих.
1шаг ? 5 ? 5-1
Result:=Index*MulNumber(index-1);
|
2шаг(1копия) ... ? 4 ? 4-1
Result:=Index*MulNumber(index-1);
|
3шаг (2копия) ... ? 3 ? 3-1
Result:=Index*MulNumber(index-1);
|
4шаг (3копия) ... ? 2 ? 2-1
Result:=Index*MulNumber(index-1);
|
5шаг (4копия) ... 1 1
Result:=Index; Здесь конец
рекурсии, т.к. не
создается более копий.
Результ=1 возвращается в 4 шаг, откуда и была вызвана.
Шаг 4 получает значение шага 5 и расчитывает результат. Результ=2 возвращается
в 3 шаг...
И так далее, что тут не понятно?
Одна функция вызвала ДРУГУЮ. Пусть название и параметры одинаковы, но
это ДРУГАЯ функция. Для нее выделяется ДРУГОЕ адресное пространство.