2010-11-08 3 views
1

Я хочу сделать рекурсивную функцию, которая выполняет итерацию через дерево и первый раз, когда состояние попадает, я хочу, чтобы оно возвращалось. Будет ли это правильно?Рекурсивная функция, которая возвращает bool?

bool nodeExists(Node *root, Node *target) 
{ 
    if(root == target) 
    { 
     return true; 
    } 

    for(int i = 0; i < root->nodes.size(); ++i) 
    {    
     if(nodeExists(root->nodes[i],target)) {return true;}  
    } 
    return false; 
} 
+1

он выглядит правильно – tga

+0

Выглядит хорошо для меня. – CodesInChaos

+5

Это нормально? Если он не прошел тесты, то он не работает. Если он проходит тесты, и у вас все еще есть опасения по поводу этого, тогда вы должны описать свои тесты и сформулировать свои проблемы. – abelenky

ответ

3

Это хорошо, но я бы предпочел использовать другой идентификатор, чем «узлы». «дети» хороши, потому что это ясно и однозначно.

+0

Да, я просто использовал узел, чтобы быть общим, я на самом деле использую детей и итераторы – jmasterx

0

Он хорошо выглядит. Хотя вы действительно должны проверить свой код, возможно, у вас есть ошибки с указателями. (Зависит от вашего класса узла очень много ...)

0

Это сработало бы, так как оператор возврата автоматически выйдет из функции. Другой способ:

bool nodeExists(Node *root, Node *target) 
{ 
    if(root == target) 
    { 
     return true; 
    } 

    bool returnValue = false; 

    for(int i = 0; i < root->nodes.size(); ++i) 
    { 
     if(nodeExists(root->nodes[i],target)) {returnValue = true; break;} 
    } 
    return returnValue; 
} 
+4

Это, однако, сложнее и ничего не получает. – sbi

+0

Я не сказал, что это лучший способ, просто альтернатива. Это практически эквивалентно оригиналу. Разрыв функции на более мелкие части упрощает понимание того, что происходит на самом деле. –

+0

@Evan: Нет, нет. Функция должна всегда возвращаться как можно скорее. Оригинальный код OP намного легче понять, чем ваш опубликованный код. – Puppy

1

Думаю, вы написали это правильно. Вы проверили это?

Смежные вопросы