用二叉树应该可以解决!
函数只有执行、不执行两种情况,假定根节点为当前函数名,左儿子为条件成立后执行的函数名,右儿子为条件不成立,即不执行函数名,构造一个数据结构
struct FuncPathTree{
struct FuncPath *left; //条件成立,执行的函数
struct FuncPath *right; //条件不成立,不执行的函数
bool judge; //判断函数是否已执行过
};
改写上述代码,在函数参数列表上增加一个参数,以A为例:
void funcA(...,FuncPathTree);
void funcA()
{
if (condition)
{
funcC(...,FuncPathTree->left); //若仍有函数调用则继续执行,直到左子树到底
} else {
funcD(...,FuncPath->right); //这里将不会执行(if不满足的情况)
}
... //这里保存一下funcC()需要的结果
...
//用judege去判断函数是否已执行,即调用过就将judege赋真,没调用就赋假
if(!(FuncPathTree->left)->judege){
funcC(...,FuncPathTree);
}
if(!(FuncPathTree->right)->judege){
funcD(...,FuncPathTree);
}
//为了记录未执行函数情况,可以在这里模拟一遍执行情况,修改参数等为临时值,防止对正常代码结果干扰,这里比较麻烦,视情况修改
...
}
这样是能考虑到if条件不满足的路径的,最后结果按需要格式遍历下二叉树然后输出就可以了。还可以用判断judege的值去需找该代码真正执行路径。若有不足请指教?效率应该还可以!