2013-09-16 15 views
1

Я разрабатываю приложение, которое использует рекурсию.Как я могу избежать рекурсии?

void Keres(char[,] array, int width, int height) 
{ 
    _found = Search(array, height, width, _words); 

    if (_found.Count < 6) 
    { 
     _found.Clear(); 
     Keres(array, width, height); 
    } 
} 

Поиск является рекурсивным методом и возвращает строковый список. И мне нужно, чтобы количество было больше 5. Но если это не так, мне нужно снова и снова вызвать метод Keres, пока он не будет равен 6 или больше, но мое приложение замерзает.

Вот где я вызываю метод Керес:

if ((string)appSettings["gamelanguage"] == "english") 
       { 
        szo = EngInput(3, 3); //szo is a char[,] array 
        Keres(szo, 3, 3); 
       } 

Что я могу сделать, чтобы избежать рекурсии или избежать аварии, и получить мои> 6 пунктов?

Edit: Метод поиска

List<string> Search(char[,] letter_table, int height, int width, List<string> words_list) 
{ 
    List<string> possible_words = new List<string>(); 
    char[,] _tmp_letter_table = _tmp_letter_table = new char[height, width]; 
    bool possible = false; 

    foreach (String word in words_list) 
    { 
     possible = false; 
     Array.Copy(letter_table, _tmp_letter_table, width * height); 
     for (int i = 0; i < height; i++) 
     { 
      for (int j = 0; j < width; j++) 
      { 
       if (_tmp_letter_table[i, j] == word[0]) 
       { 
        if (IsNeighborTest(word, i, j, height, width, _tmp_letter_table, 0) == true) 
        { 
         possible = true; 
         break; 
        } 
        else 
        { 
         Array.Copy(letter_table, _tmp_letter_table, width * height); 
        } 
       } 
      } 

      if (possible == true) 
      { 
       possible_words.Add(word); 
       break; 
      } 
     } 
    } 
    return possible_words; 
} 
+1

Так в чем проблема? Объявление или рекурсия? Я имею в виду: вы уверены, что рекурсия является основной причиной? –

+1

BTW, в вашем методе 'Keres' вы вызываете' Поиск' с теми же параметрами снова и снова. Вероятно, из-за этого ваше приложение выходит из строя с помощью StackOverflowException. Если так - тогда избавиться от рекурсии это исправит. .. и вы получите outofmemoryexception или приложение будет висеть. Если в методе поиска вы вызываете некоторый Thread.Sleep или что-то еще, чтобы ждать и надеяться на что-то, это может заставить метод 'Search' возвращать другой результат. –

+0

. Отправьте код для' Search() '. Кроме того, является 'Search' рекурсивным методом? Из того, что я вижу, «Keres» также рекурсивный. – PoweredByOrange

ответ

2

Ваш код не является правильной рекурсией, на самом деле вы c alling всегда один и тот же метод, каждый раз, когда рекурсивный метод называется чем-то, что-то должно быть изменено, очевидно, в вашем коде вы никогда не покидаете метод, и приложение зависает.

Я думаю, если бы я понял, что вы хотите, проблема, с которой вы сталкиваетесь, не разрешима с рекурсией.

Возможно, массив имеет значение, которое изменяется и до тех пор, пока не будет изменено на> 6, которое вы хотите проверить с помощью метода Keres? Тогда рекурсия - это не способ сделать это.

+0

Я бы знал, что это должно быть что-то очевидное. Мой массив изменяется, и если я не могу получить> 6 элементов в первый раз, я никогда этого не сделаю. Таким образом, Keres был бесконечным, если метод Search возвратил <6 элементов. – fzl

2

Вы можете избежать рекурсии с помощью простого цикла:

void Keres(char[,] array, int width, int height) 
{ 
    do 
    { 
     _found = Search(array,height,width,_words); 
    } while (_found.Count < 6) 
} 

Но если приложение замораживании с помощью рекурсии, она, вероятно, может замерзнуть без него, так как они должны сделайте то же самое (этот метод может избежать StackOverflow Exception, но если это займет много итераций)

+0

+1 для устранения вызова рекурсии; и, что более важно, указывая, что он * может * заморозить приложение. Я бы сказал * сам, но это придирка. – NotMe

+0

Я пробовал ваше предложение, но оно все еще падает. – fzl

+0

@ChrisLively У меня было предположение, что несколько вызовов 'Search' будут давать разные результаты каждый раз, но трудно сказать, не зная, как это реализовано (редактирование только что заметило, что он обновил вопрос). –

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