2014-11-23 4 views
0

Я использую рекурсивный метод для обработки некоторых матриц. Проблема в том, что при возврате рекурсии значение этой матрицы не восстанавливается из стека (значение до и после возврата одинаково).Рекурсия: функция не восстанавливает значение из стека

Я пытаюсь сделать 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()). Проблема заключается в следующем: эти вычисления происходят с неправильной матрицей .

Это похоже на то, что рекурсия возврата не существует. Я не могу этого понять.

Любые мысли? Трудно объяснить, но я попробовал. Любой вопрос, спросите меня.

Большое спасибо.

+0

Можете ли вы опубликовать код, который компилируется? – Fildor

+0

http://www.codeshare.io/OUa2M (комментарии на португальском языке. Ошибка возникает после функции deMorgan() - в моем примере deMorgan() эквивалентно changeSignal(). Вы можете поместить точку прерывания в эту строку) , – misc

+0

Рекурсия работает так, как ожидалось. Вам нужно отслеживать глубину, если вы хотите, чтобы некоторые вычисления выполнялись только на начальном уровне. – Fildor

ответ

0

Есть две возможности.

  1. Разделите свою функцию на вызов рекурсивной функции и вычислите ее результат.

Как так

Integer [][] complement (Integer[][] m){ 
    Integer[][] recurResult = recursiveComplement (m); 
    // recursion has finished 
    return doSomething (recurResult); 
} 

Integer[][] recursiveComplement(Integer[][] m){ 
    if(endCondition(m)) return m; // Checks if Recursion shall be ended. 
    Integer[][] levelM = doComplementTransform(m); 
    return recursiveComplement(levelM); 
} 

В recursiveComplement идет рекурсии часть.

  1. Добавьте параметр глубины, который вы увеличиваете в каждом самозанятости (вычислите (M, глубина +1)). Если после звонка глубина равна 0, вы снова находитесь на начальном уровне.
+0

не знаю, понимаете ли вы правильно. вот проблематичный кусок моего кода: http://www.codeshare.io/OUa2M. когда обратная связь рекурсии и ПК перемещаются к строке 15, F не то же самое, что вызывается в строке 14. Я не могу понять, как сохранить F без изменений до вызова P и N (я уже пытался сделать копию F и используйте эту копию в строке 15, но она работает только для первого уровня рекурсии) ... большое спасибо за ваше терпение! :) – misc

+0

Это ожидаемое поведение. Вы говорите F, что это результат следующего уровня рекурсии. Чего ты ожидал? И как побочный элемент, вы не возвращаете ничего, если статус пуст. – Fildor

+0

Большое спасибо. Наконец решите. Я просто поместил переменную глубины для управления рекурсией и с некоторыми изменениями в моем алгоритме, она работает. – misc