Рекурсія – функціональне програмування

Ми бачили, що елементи колекції можна обробляти в циклі за допомогою оператора foreach Для цих цілей функціональні мови застосовують не цикли, а рекурсіюСкажімо, що нам потрібно виконати рахунок від нуля до певного чіа Це можна зробити за допомогою лямбда-вирази таким чином: delegate void Counter (int iterations)

Counter RecursiveCount = (iterations) =&gt { if (iterations &gt0 ) {

RecursiveCount(iterations – 1)

}

ConsoleWriteLine(&quotCurr count( &quot + iterations + &quot)&quot)

}

RecursiveCount(lO)

У даному вихідному коді визначається делегат, який оголошує метод Counter (), що має єдиний параметр iterations За допомогою цього параметра можна вести рахунок, скільки ще раз необхідно виконати рекурсію У реалізації лямбда-вирази рекурсія активується за допомогою виклику перенісши Recurs iveCount, яка є лямбда-виразом з присвоєним лю Але, незважаючи на те, що, здавалося б, даний підхід повинен працювати, т к він начебто має сенс, дане рекурсивне вираз не працює і навіть не компілюється

Щоб змусити рекурсию з використанням лямбда-виразів працювати, потрібен набагато складніший код Цей підхід обговорюється у двох блогах: Веснера Мойзо (Wesner Moise) за адресоюhttp://wesnermblogsconi/net_undocumented/ 2007/03/anonymous_recurhtml   і MSDN за адресоюhttp://blogsmsdncom/madst/ archive/2007/05/ll/recursive-lambda-expressionsaspx    Якщо ви приділите трохи часу цим блогам, то дуже швидко усвідомлюєте, що змусити працювати рекурсию із застосуванням лямбда-виразів – вкрай складне завдання Так навіщо взагалі робити це А хто каже, що це потрібно робити Навпаки, слід уникати цього

підходу, т к для нього потрібно занадто багато знань про подробиці лямбдираженій

Замість лямбда-виразів рекурсію можна організувати за допомогою анонімних делегатів Далі наводиться простий, хоча і не дуже елегантний, приклад, як це зробити:

delegate void Counter(Counter counter, int value) class Program {

static void Main( string[] args) {

Counter counter = delegate(Counter paramCounter, int iterations) { if (iterations &gt 0) {

paramCounter(paramCounter, iterations – 1)

}

ConsoleWriteLine(&quotCurr count( &quot + iterations + &quot)&quot)

}

counter(counter, 10)

}

}

При виклику делегата в ньому необхідно передати елемент, який буде визаться рекурсивно (counter (counter .)) Але це може викликати помилки і непостнство в роботі методу

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*