递归布尔函数

时间:2011-03-30 04:42:00

标签: c++ recursion

说我有以下内容:

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

所以我在这里做的是遍历一个完整的四叉树,寻找一个我得到的情况。我需要这个函数才能在totalDiff大于容差的情况下返回true。我担心我所拥有的并不是我希望它会做的事情。看看函数,当我在我的包装器方法中设置signal1时,如果只发现1个这种情况,我会得到true吗?或者我做错了吗?

2 个答案:

答案 0 :(得分:2)

该功能看起来正确,但我有一些风格的评论。首先,尝试将其称为其他内容,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 :(得分:1)

你会以这种方式击中四叉树中的每一片叶子。相反,你想在找到它之后立即休息。要做到这一点,你需要改变

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);