C # Урок, рекурсия

C # позволява метод да се самоизвиква. Този процес се нарича рекурсия, и метод, който се извиква, е рекурсивен. По принцип рекурсията е процес, по време на който нещо се самоопределя. В това отношение донякъде напомня на циклично определение. Основната разлика между рекурсивния метод е, че той съдържа израз, в който методът се извиква. Рекурсията е ефективен механизъм за управление на програмата.

Класически пример за рекурсия е изчисляването на факториал на число:

Обърнете внимание, че рекурсивният факториален метод се извиква и променливата i намалява с 1 с всяко повикване.

Рекурсивните версии на много процедури могат да се изпълняват малко по-бавно от техните итеративни аналози поради допълнителните режийни системни ресурси при множество извиквания на методи. Ако има твърде много такива повиквания, тогава системният стек може в крайна сметка да прелее. И тъй като параметрите и локалните променливи на рекурсивния метод се съхраняват в системния стек и всеки път, когато този метод бъде извикан, се създава ново копие от тях, в един момент стекът може да бъде изчерпан. В този случай се хвърля изключение и общото езиково изпълнение (CLR) хвърля съответно изключение. Но трябва да се притеснявате за това само ако рекурсивната процедура не е изпълнена правилно.

Основното предимство на рекурсията е, че позволява някои алгоритми да бъдат внедрени по-ясно и по-лесно, отколкото итеративно. Например, алгоритъмът за бърза сортировка е доста труден за изпълнение по итеративен начин. А някои задачи, например изкуствен интелект, очевидно изискват рекурсивно решение.

Когато пишете рекурсивни методи, не забравяйте да включите условен израз, като например, на подходящото място, за да се върнете от метода без рекурсия. В противен случай рекурсивният метод, извикан веднъж, може изобщо да не се върне. Този вид грешка е доста типичен за прилагането на рекурсия в практиката на програмиране. В този случай се препоръчва да се използват изрази, съдържащи извиквания на метода WriteLine (), за да се следи какво се случва в рекурсивния метод и да се прекъсне изпълнението му, ако в него бъде открита грешка.