Удобная для iPhone альтернатива рекурсии по огромным древовидным структурам?

#iphone #objective-c #algorithm #recursion

#iPhone #objective-c #алгоритм #рекурсия

Вопрос:

У меня есть график объектов того же типа. Каждый объект связан с 0, 1 или многими другими. Мне нужно пройти по всем возможным путям на графике.

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

Я слышал, что есть способы получше, чем рекурсия, когда метод продолжает вызывать себя снова и снова.

Как выглядят альтернативы?

Ответ №1:

Что-то вроде:

(давайте предположим, что TreeNode содержит свойство NSArray * children)

 -(void)iterateOverTree:(TreeNode *)node
{
    NSMutableArray * elements = [NSMutableArray array];
    [elements addObject:node];

    while([elements count])
    {
        TreeNode * current = [elements objectAtIndex:0];
        [self doStuffWithNode:current];
        for(TreeNode * child in current.children)
        {
            [elements addObject:child];
        }

        [elements removeObjectAtIndex:0];
    }
}
  

Осторожно, непроверенный код 🙂

Ответ №2:

Вы можете «имитировать» стек самостоятельно, сохраняя текущее состояние в NSArray. Это позволит использовать кучу вместо стековой памяти и, возможно, решить проблему переполнения стека.

Комментарии:

1. Ответ Йориса Мана дает обзор того, что вы можете написать. Для каждой структуры требуется немного другой код.