25.07.2017 Views

Intro-CSharp-Book-v2015

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

372 Въведение в програмирането със C#<br />

}<br />

Recursion(some parameters);<br />

do some calculations;<br />

При такъв процес, когато имаме само едно рекурсивно извикване в тялото<br />

на рекурсивния метод, не е нужно да ползваме рекурсия, защото итерацията<br />

е очевидна.<br />

Понякога, обаче имаме разклонен или дървовиден изчислителен<br />

процес. Например имитацията на N вложени цикъла не може лесно да се<br />

замени с итерация. Вероятно сте забелязали, че нашият итеративен алгоритъм,<br />

който имитира вложените цикли, работи на абсолютно различен<br />

принцип. Опитайте да реализирате същото поведение без рекурсия и ще се<br />

убедите, че не е лесно.<br />

По принцип всяка рекурсия може да се сведе до итерация чрез използване<br />

на стек на извикванията (какъвто се създава по време на изпълнение<br />

на програмата), но това е сложно и от него няма никаква полза. Рекурсията<br />

трябва да се ползва, когато дава просто, лесно за разбиране и ефективно<br />

решение на даден проблем, за който няма очевидно итеративно решение.<br />

При дървовидните изчислителни процеси на всяка стъпка от рекурсията се<br />

извършват няколко на брой рекурсивни извиквания и схемата на<br />

извършване на изчисленията може да се визуализира като дърво (а не като<br />

списък, както при линейните изчисления). Например при изчислението на<br />

числата на Фибоначи видяхме какво дърво на рекурсивните извиквания се<br />

получава.<br />

Типичната схема на дървовидния изчислителен процес можем да опишем<br />

чрез псевдокод така:<br />

void Recursion(parameters)<br />

{<br />

do some calculations;<br />

Recursion(some parameters);<br />

...<br />

Recursion(some other parameters);<br />

do some calculations;<br />

}<br />

Дървовидните изчислителни процеси не могат директно да бъдат сведени<br />

до итеративни (за разлика от линейните). Случаят с числата на Фибоначи<br />

е простичък, защото всяко следващо число се изчислява чрез предходните,<br />

които можем да изчислим предварително. Понякога, обаче всяко следващо<br />

число се изчислява не само чрез предходните, а и чрез следващите и<br />

рекурсивната зависимост не е толкова проста. В такъв случай рекурсията<br />

се оказва особено ефективна.<br />

Ще илюстрираме последното твърдение с един класически пример.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!