2014-02-06 1 views
1

Это первый раз, когда я использовал рекурсию, чтобы сделать что-то другое, чем найти факториал числа. Я строю программу, чтобы найти слова в болотной доске. Ниже приведена функция, которая приводит к нарушениям:C++ рекурсия segfault. Можете ли вы помочь мне понять, что я делаю неправильно?

void findWord(vector<string>& board, set<string>& dictionary, 
      string prefix, int row, int column){ 
    prefix += getTile(board, row, column); 
    if(prefix.length() > biggestWordLength) 
    return; 
    if(isOutOfBounds(row, column)) 
    return; 
    if(isWord(prefix, dictionary) == 1) 
    foundWords.insert(prefix); 
    if(isWord(prefix, dictionary) == 0) 
    return; 
    //Note: this does not prevent using the same tile twice in a word 
    findWord(board, dictionary, prefix, row-1, column-1); 
    findWord(board, dictionary, prefix, row-1, column); 
    findWord(board, dictionary, prefix, row-1, column+1); 
    findWord(board, dictionary, prefix, row, column-1); 
    findWord(board, dictionary, prefix, row, column+1); 
    findWord(board, dictionary, prefix, row+1, column-1); 
    findWord(board, dictionary, prefix, row+1, column); 
    findWord(board, dictionary, prefix, row+1, column+1); 
} 
+1

Вы должны поместить проверку границ * перед * частью, где вы добавляете символ в конец 'prefix' – Brian

ответ

3

Вы рекурсивете во всех направлениях во всех случаях. Рассмотрим эту сокращенную версию рекурсии:

void findword(... int x, int y, ...) { 
    ... 
    findword(... x, y+1, ...); 
    findword(... x, y-1, ...); 
    ... 
} 

Теперь рассмотрим, когда она вызывается для x == 5 и y == 5 (например, любая другая позиция была бы столь же хорошо). Я использую отступ ниже для представления вложенных вызовов:

findword(... 5, 5, ...) 
    findword(..., 5, 6, ...) // x, y+1 
     ... 
    findword(..., 5, 5, ...) // x, y-1 
     // ouch! this is just the same as before, so it will eventually: 
     findword(..., 5, 6, ...) 
     findword(..., 5, 5, ...) 
      // ouch!... here again! shall I continue? 

Теперь подумайте об алгоритме. Когда вы ищете слово, сначала выбираете первый символ, затем направлении, а затем тестируете в в этом направлении сколько букв может составлять слово. Алгоритм, который вы реализовали, пытается найти слова не только в строках, но и в любой случайной форме.

+0

Удивительное объяснение! Спасибо за вашу помощь! – bweber13

+0

Теперь у меня новая проблема. Что-то с тем, как я передаю свои аргументы, вызывает segfault. Я обновляю свой вопрос, вы можете мне помочь? – bweber13

+0

Вы не должны * обновлять * вопросы с новым контентом. Вы должны создать отдельный новый вопрос. Вы обновляете вопрос, чтобы предоставить дополнительную информацию об исходной проблеме, уточните .... вы не * измените *. Поскольку мы находимся в этом, невозможно даже ответить на обновление, не видя определения вопроса. Пожалуйста, отскакивайте вопрос, задайте другой вопрос и предоставьте всю необходимую информацию –

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