Как мне разбить программу на N рекурсивного вызова функции? - PullRequest
2 голосов
/ 14 июня 2019

В моей программе рекурсивный вызов :

Left?.Generate(ref result, ref resultGiven);

Я хочу отладить свою программу и остановить выполнение , когда эта Generate() функция была вызвана 6 раз. Как мне это сделать?

Ответы [ 3 ]

1 голос
/ 14 июня 2019

Если я вас правильно понял, вы хотите ограничить глубину рекурсии (т.е. не позволяйте Generate вызывать себя более 6 раз). Если это ваш случай, вы можете попробовать StackTrace класс для этого:

using System.Diagnostics;

...

void Generate(ref result, ref resultGiven) {
  // --- Comment this out after debugging
  string currentFrame = new StackTrace(new StackFrame(false)).ToString().Trim();

  StackTrace trace = new StackTrace();

  int depth = trace
    .ToString()
    .Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries)
    .Where(frame => frame.Trim() == currentFrame)
    //.TakeWhile(frame => frame.Trim() == currentFrame) // if direct calls only
    .Count();

  // Prevent Generate to call itself more than 6 time 
  if (depth > 6) {
    // Maximum depth reached, return or launch debugger - Debugger.Launch()
    return;  
  }
  // --- Comment this out after debugging

  ...
}
1 голос
/ 14 июня 2019

Использовать параметр количества или шага будет достаточно;

Left?.Generate(ref result, ref resultGiven); // is same

И функция будет выглядеть примерно так:

void Generate(object ref result, object ref resultGiven, int step = 0)
{
  // do stuf

  // break for debug
  if (step >= 6)
  {
    return; 
  }
  // or only break when debugger is attached
  if (System.Diagnostics.Debugger.IsAttached && step >= 6)
  {
    return; 
  }
  // recursive
  Generate(ref result, ref resultGiven, step++);
}
1 голос
/ 14 июня 2019

Самый простой способ - использовать глобальную переменную.

// somewhere before Generate first call
var counter = 0;

void Generate(ref result, ref resultGiven)
{
  if (counter == 6)
     return;
  counter++;
  // the rest of function's body
} 
...