Рекурсивним називається метод, який викликає сам себе. Така рекурсія називаються ється прямий. Існує ще непряма рекурсія, коли два або більше методу викликають один одного. Якщо метод викликає себе, в стеку створюється копія значень його параметрів, як і при виклику звичайного методу, після чого управління пере-дається першому виконуваного оператору методу. При повторному виклику цей процес повторюється.
Ясно, що для завершення обчислень кожен рекурсивний метод повинен содер-жати хоча б одну нерекурсівние гілка алгоритму, що закінчується оператором повернення. При завершенні методу відповідна частина стека звільняється і управління передається зухвалому методу, виконання якого продолжа-ється з точки, наступного за рекурсивним викликом.
Класичним прикладом рекурсивної функції є функція обчислення факторіала (це не означає, що факторіал слід обчислювати саме так). Для! того щоб отримати значення факторіала числа п, потрібно помножити на п фак-Торіана числа (п - 1). Відомо також, що 0! = 1 і 1! = 1:
long fact (long n)
return 1; // нерекурсівние гілка
return (n * fact (n - 1)); // рекурсивна гілка
To ж саме можна записати коротше:
long fact (long n)
return (n> 1). n * fact (n - 1). 1;
Рекурсивні методи найчастіше застосовують для компактної реалізації рекур-пасивного алгоритмів, а також для роботи зі структурами даних, описаними ре-курсивні, наприклад, з двійковими деревами (поняття про довічним дереві дається в главі 13). Будь-рекурсивний метод можна реалізувати без застосування ре-курси, для цього програміст повинен забезпечити зберігання всіх необхідних даних самостійно.
До переваг рекурсії можна віднести компактність запису, до недостат-кам - витрата часу і пам'яті на повторні виклики методу і передачу йому ко-пий параметрів, а головне, небезпека переповнення стека.
Методи зі змінною кількістю аргументів
Іноді буває зручно створити метод, в який можна передавати різний ко-личество аргументів. Мова С # надає таку можливість за допомогою ключового слова params. Параметр, позначений цим ключовим словом, раз-міщан в списку параметрів останнім і позначає масив заданого типу невизначеної довжини, наприклад: public int Calculate (int a. Out int з params int [] d).
У цей метод можна передати три і більше параметрів. Усередині методу до параметрів починаючи з третього, звертаються як до звичайних елементів масиву. кількість
елементів масиву отримують за допомогою його властивості Length. Як приклад розглянемо метод обчислення середнього значення елементів масиву (лістинг 7.1).
Лістинг 7.1. Метод з перемінним числом параметрів
public static double Average (params int [] a)
Результат роботи програми:
Недостатньо аргументів на методі
В даному алгоритмі відсутність аргументів при виклику методу Average є помилкою. Цей випадок обробляється генерацією винятку. Якщо не обробити цю помилку, результат обчислення середнього дорівнюватиме «не числом» (NaN) внаслідок її вія ділення на нуль в операторі повернення з методу.
Параметр-масив може бути тільки один і повинен розташовуватися останнім у списку. Відповідні йому аргументи повинні мати типи, для яких мож-ли-неявне перетворення до типу масиву.