Я использую рекурсивный метод для обработки некоторых матриц. Проблема в том, что при возврате рекурсии значение этой матрицы не восстанавливается из стека (значение до и после возврата одинаково).Рекурсия: функция не восстанавливает значение из стека
Я пытаюсь сделать looooot вещей, но ничего не решить. Кстати, я уже пытался сравнить шаг за шагом мою программу с другими (подробно из друзей и работ по работе с пением), и до рекурсии обе программы равны. После рекурсии спины, только моя матрица ошибается ...
Вот часть моего кода:
public static Integer [][] Complement(Integer[][] M){
if (OneRowNotEmpty(M)) { // just one row of matrix are different then 0s
return changeSignalLine(M);
}
else {
int row = DefineLineToErase(M);
matrix = Complement(zeraLinha(row, M); // recursion
dosomething();
}
/* make some stuffs, but at this point my M are wrong*/
return finalMatrix; // just for illustrate. this matrix are built in lines after recursion
}
Это проще на примере: В уровне «А», моя матрица являются:
[ 00 00] (matrix on level "A" of recursion) M = [ 11 10] [ 11 01]
Давайте предположим, что мое стирание строка является второй, так:
[ 00 00] (matrix on level "B" of recursion) M = [ 00 00] [ 11 01]
В этот момент, на уровне "B", функция OneRowNotEmpty (М) является истинным, так что она возвращает следующую матрицу:
[ 00 00] (til' here, everything is fine) M = [ 00 00] [-11 -01]
В этой точке, рекурсии должен вернуться к матрице M на уровне «A» и продолжать вычислять (doSomething()), но он возвращается к матрице M на уровне «B» и продолжает вычислять (doSomething()). Проблема заключается в следующем: эти вычисления происходят с неправильной матрицей .
Это похоже на то, что рекурсия возврата не существует. Я не могу этого понять.
Любые мысли? Трудно объяснить, но я попробовал. Любой вопрос, спросите меня.
Большое спасибо.
Можете ли вы опубликовать код, который компилируется? – Fildor
http://www.codeshare.io/OUa2M (комментарии на португальском языке. Ошибка возникает после функции deMorgan() - в моем примере deMorgan() эквивалентно changeSignal(). Вы можете поместить точку прерывания в эту строку) , – misc
Рекурсия работает так, как ожидалось. Вам нужно отслеживать глубину, если вы хотите, чтобы некоторые вычисления выполнялись только на начальном уровне. – Fildor