для рекурсии цикла с узлом n-арного дерева - PullRequest
0 голосов
/ 23 ноября 2011

Рекурсивный вызов функции неожиданно зависает после достижения предела.

когда функция вызывается из main, корневой узел передается первым, и в цикле потомки корневого узла проверяются на значение размера, и рекурсивно эта же функция вызывается для этого потомка для установки значения размера.

мой ввод очень большое дерево. когда я печатаю n-арное дерево перед установкой размера элементов в дереве, список печатается со всеми элементами. но во время рекурсии setsize () выполнение зависает в определенной точке бессмысленно. каждый раз, когда выполнение останавливается на том же элементе. если я удаляю элементы после того элемента, где он висит, из моего ввода при создании n-арного дерева, выполнение будет успешным и не зависнет.

Я пытался увеличить -Xss -Xmx -Xss. все еще бесполезен.

Должен ли я использовать многопоточность или, пожалуйста, сообщите мне, если есть какие-либо проблемы в моем ниже рекурсивном методе для вышеописанной реализации функции. Thx !!

public void setsize(Element inEle){
        for(int i =0;i<inEle.children.size();i++){
            if(inEle.children.get(i).size==0)
            {                   
                this.setsize(inEle.children.get(i));
                i--;
            }else
            {
                if(!inEle.children.get(i).isRedefine)
                    inEle.size=inEle.size+inEle.children.get(i).size;                   
            }
        }
        inEle.size=inEle.size*inEle.occurs;
    }

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011

Судя по этой строке, inEle.size=inEle.size+inEle.children.get(i).size; похоже, что размер элемента - это сумма размеров под ним. Проблема, которую я вижу, заключается в том, что никогда некуда начинать. Итак, давайте просто предположим, что он считает узлы, и тогда вы можете изменить фактическое вычисление на то, что вам нужно.

Первое, что я хотел бы сделать, это изменить метод setSize, чтобы он также возвращал размер и набор. Итак, как следует

public int setSize(Element parent) {
    int size = 0;
    for(Element child : parent.children()) { // enhanced for loop
        size += setSize(child);
    }
    parent.size = size + 1; // the +1 is the current node
    return size;
}

Тогда вы можете просто вызвать его в корне:

int treeSize = setSize(root);
0 голосов
/ 23 ноября 2011

Я предполагаю, что что-то не так с i++ и i-- в одинаковом состоянии.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...