Рекурсивная булева функция - PullRequest
0 голосов
/ 30 марта 2011

Скажем, у меня есть следующее:

bool signal(QtreeNode * & orig, QtreeNode * & n, int tolerance) {

    bool signal1= false, signal2= false, signal3= false, signal4= false;
    if(n->isLeaf()){
        if(totalDiff>tolerance) //suppose these were defined
            return true;
        else return false;
    }
    signal1=signal(orig, n->neChild, tolerance); 
    signal2=signal(orig, n->nwChild, tolerance);
    signal3=signal(orig, n->swChild, tolerance);
    signal4=signal(orig, n->seChild, tolerance);

    if(signal1 || signal2 || signal3 || signal4)
        return true;
    else return false;
}

И, скажем, я вызываю этот метод из некоторого метода-обертки, подобного этому:

signal1=signal(orig, n, tolerance);
    if(signal1)
        //do something

Итак, что я делаю здесь, это обходВесь квад-дерево ищет только один случай, когда я получаю правду.Все, что мне нужно для этой функции, это вернуть true в одном случае, когда totalDiff больше, чем допуск.Боюсь, что то, что у меня есть, не делает то, на что я надеялась.Глядя на функцию, кажется ли, что когда я устанавливаю signal1 в моем методе-обертке, я получу true обратно, если он найдет только 1 случай этого условия?Или я делаю это неправильно?

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Функция выглядит правильно, но у меня есть несколько стилистических комментариев. Во-первых, попробуйте назвать это как-нибудь иначе, signal - очень распространенная функция в операционных системах POSIX.

Во-вторых, я бы либо включал фактические вызовы функций в оператор if, либо просто имел 4 оператора if, каждый из которых возвращался, для оценки короткого замыкания и (субъективно) немного очищать код. То есть либо:

return (signal(orig, n->neChild, tolerance) ||
        signal(orig, n->nwChild, tolerance) ||
        signal(orig, n->swChild, tolerance) ||
        signal(orig, n->seChild, tolerance));

или

if (signal(orig, n->neChild, tolerance))
   return true;
if (signal(orig, n->nwChild, tolerance))
   return true;
if (signal(orig, n->swChild, tolerance))
   return true;
if (signal(orig, n->seChild, tolerance))
   return true;
return false;

Наконец, я хотел бы добавить, что я либо создам новый класс, производный от QtreeNode, который реализует метод, подобный nodeDifference, либо просто добавлю его, если вы управляете источником QtreeNode, который может очистить ваш код дальше, т.е.

bool signal(QtreeNode *&orig, QtreeNode *&n, int tolerance) {
  if (n->isLeaf())
     return (orig->nodeDifference(*n) > tolerance);
  else
     return (signal(orig, n->neChild, tolerance) ||
             signal(orig, n->nwChild, tolerance) ||
             signal(orig, n->swChild, tolerance) ||
             signal(orig, n->seChild, tolerance));
 }
1 голос
/ 30 марта 2011

Таким образом, вы поразите каждый лист вашего дерева.Вместо этого вы хотите сломать, как только вы нашли это.Для этого вам нужно изменить

signal1=signal(orig, n->neChild, tolerance); 
signal2=signal(orig, n->nwChild, tolerance);
signal3=signal(orig, n->swChild, tolerance);
signal4=signal(orig, n->seChild, tolerance);

if(signal1 || signal2 || signal3 || signal4)
    return true;
else return false;

на

return signal(orig, n->neChild, tolerance) || 
       signal(orig, n->nwChild, tolerance) ||
       signal(orig, n->swChild, tolerance) ||
       signal(orig, n->seChild, tolerance);
...