2013-12-15 3 views
2

Я просмотрел массу ссылок и увидел, что C# поддерживает вложенные функции через лямбда, но я совершенно не знаком с C# (и .NET в этом отношении). Я хочу написать реализацию наводнения, с параметрами родительской функции, доступной для вложенного дочернего элемента.Вложенные функции с рекурсией

Вот что она должна выглядеть, в идеале:

private void StartFloodFill(color,otherstuff,pixel) 
{ 
     function Recursion(pixel,color) 
     { 
      do(otherstuff); 
      //etc... 
      Recursion(pixel,color); 
     } 
} 

Recursion(pixel,color); вызов, где моя путаница лежит. Я не могу получить доступ к ссылке на функцию изнутри функции.

Я знаю, что для этого должен быть обходной путь, но я не знаю, что это такое. Как я могу реализовать рекурсивную функцию, подобную описанной выше в C#?

+0

Рекурсивный делегат? – SJuan76

+0

Не знаю. Вы можете объяснить? – Harangue

+0

Почему это закрылось? Это совершенно законный вопрос, и о нем ничего не известно. Эта идиома используется в функциональном программировании все время. – BitTickler

ответ

4

Как и было предложено, вы можете использовать рекурсивный делегат. Как правило, вы бы объявить делегат, как это:

Func<int,int, int> = (a, b) => a+b; 

Где Func<int, int, int> является тип делегата, который принимает 2 Интс, и возвращает другой Int.

Но поскольку вы хотите, чтобы он вызывал себя, вам нужно объявить переменную перед назначением делегата.

Func<Pixel, Color, SomeType> func = null; 

func = (pixel, color) => { 
    //do stuff... 

    if(endCondition) 
     return someTypeValue; 
    else 
     return func(pixel, color); 
}; 
+0

+1: Обратите внимание, что вам не нужно назначать функцию переменной - [Анонимная рекурсия в C#] (http://blogs.msdn.com/b/wesdyer/archive/2007/02/02/anonymous -recursion-in-c.aspx) ... Но если вы ожидаете, что не-функциональные программисты прочитают ваш код, сначала объявите переменную, если она будет прекрасно (и, вероятно, предпочтительнее, несмотря на возможность непреднамеренно изменить эту переменную). –

Смежные вопросы