说我有以下内容:
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
吗?或者我做错了吗?
答案 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);