====== Рекурсия ======
''чтобы понять рекурсию, надо понять рекурсию'' ©
Для того чтобы понять саму рекурсию, нужно понять как работает рекурсивная функция.
Рекурсивная функция - обычная функция, при выполнении которой, может себя вызвать.
Я думаю данную функцию необходимо рассмотреть на примере. Допустим функцию, которая вычисляет [[http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B0%D0%BB|факториал ]] числа:
function factorial(a:Number):Number {
if (a >= 2) {
return a * factorial(a - 1);
} else {
return 1;
}
}
Теперь посчитаем факториал от числа 5, и выведем в трейс.
trace(factorial(5)); //Output: 120;
Теперь посчитаем факториал от числа 3, и выведем в трейс.
trace(factorial(3)); //Output: 6;
**Как это?**
Всё работает очень просто. Сначала мы вызываем саму функцию и передаем в неё число 3.
Далее уже в теле самой функции происходят следующие действия:
1) Проверка, если 3 >=(больше или равно) 2, то вернуть произведение 3 и этой же функции, но только внутрь, мы уже передаем
число на единицу меньше a-1 = 2
2) Проверка если 2 >= 2, вернуть произведение 2 и этой же функции, но только внутрь, мы уже передаем число на единицу меньше a-1 = 1
3) Проверка если 1 >= 2, в данном случае ложь, поэтому возвращаем 1.
4) В итоге получается 3*2*1 = 6
Т.е. рекурсия превратила factorial(3) в 3*2*1;
**Зацикливание:**
Необходимо избегать зацикливания рекурсивной функции путем использования операторов (if, while, for и др.) Самый простой пример зацикливания, это когда функция вызывает себя:
function recursion(a:Number):Number {
return recursion(a);
}
TODO:
* что
* зачем
* примеры использования
* примеры использования