Рекурсивная функция в Silverlight - PullRequest
2 голосов
/ 20 июля 2010

У меня есть следующая функция в моем приложении c # silverlight, чтобы найти общее количество подузлов узла в дереве

        //get total children
    private int getTotalChildren(int id) 
    {
        int total=0;
        for (int i = 0; i < persons.Count;i++ )
        {
            if (persons[i].Manager == id)
            {
                total += 1;
                total += getTotalChildren(persons[i].Id);
            }
        }
        return total;
    }

общее количество строк + = getTotalChildren (people [i] .id) делаетокна браузера автоматически закрываются, когда я запускаю его (я предполагаю, что это является причиной сбоя?) в IDE я не получаю никаких ошибок.

edit: я не вижу, как это может быть бесконечной рекурсиейтак как нет человека, который имеет себя в качестве менеджера.Person это список, построенный с использованием этого xml

<?xml version="1.0" ?> 
<Persons>
    <Person>
        <Id>1</Id>
        <Name>temp</Name>
        <Qlid>1234</Qlid>
        <Manager>0</Manager>
    </Person>
    <Person>
        <Id>2</Id>
        <Name>someone</Name>
        <Qlid>5678</Qlid>
        <Manager>1</Manager>
    </Person>
    <Person>
        <Id>3</Id>
        <Name>wefwef</Name>
        <Qlid>3333</Qlid>
        <Manager>1</Manager>
    </Person>
    <Person>
        <Id>4</Id>
        <Name>batman</Name>
        <Qlid>6723</Qlid>
        <Manager>3</Manager>
    </Person>
    <Person>
        <Id>5</Id>
        <Name>batman</Name>
        <Qlid>6723</Qlid>
        <Manager>3</Manager>
    </Person>
</Persons>

edit2: хорошо, извините, ребята, это было действительно глупо.Это был круговой цикл, я думал, что сделал ярлык для файла xml на своем рабочем столе, но вместо этого случайно сделал копию.человек 1 имел человека 3 в качестве менеджера, который имел человека 1 в качестве менеджера в файле, который программа читала, пока я редактировал копию

Ответы [ 4 ]

1 голос
/ 20 июля 2010

[Предположение] Вы можете потерпеть крах из-за переполнения стека, вызванного бесконечной рекурсией.Есть ли у вас член, чей менеджер является сам идентификатор?Это приведет к тому, что ваша рекурсия никогда не закончится и приведет к переполнению стека.

private int getTotalChildren(int id) 
{
    int total=0;
    for (int i = 0; i < persons.Count;i++ )
    {
        if (persons[i].Manager == id)
        {
            total += 1;
            if(persons[i].Manager != persons[i].Id)
            {
                total += getTotalChildren(persons[i].Id);
            }
        }
    }
    return total;
}
1 голос
/ 20 июля 2010

Вы нигде не указываете дочерние узлы. Вы всегда смотрите на людей, которые не меняются.

0 голосов
/ 22 июля 2010

Protip: рассмотрите цикл for / while, вместо того чтобы использовать накладные расходы памяти кадров, связанные с повторением, для простых подобных сценариев.

Помните, все, что вы можете сделать с помощью отречения, может быть достигнуто без него. Опытный разработчик знает, когда жертвовать производительностью ради удобочитаемости.

0 голосов
/ 20 июля 2010

Внутри Silverlight есть «предел рекурсии», разработанный, чтобы помочь избежать кода, замораживающего браузер пользователя.Если вы поищите в Google «Silverlight recursion» или аналогичную, вы найдете несколько ссылок.

Я не знаю об этом, но думаю, вам просто нужно сделать это по-другому.способ.

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