我是 C 的新手,遇到以下问题:
我正在尝试构建一个 Satsolver使用 DPLL 算法。
我猜你不必知道算法或问题来回答我的问题。
DPLL 方法会尝试一些东西并在最后调用自己两次,如下所示:
return (DPLL(newarray[0], variables, &newclauses))
|| (DPLL(newarray2[0], variables, &newclauses2));
它的想法是,最后有两个新数组。一个获得新值,另一个获得负值。
我的问题是:算法似乎没有检查第二个方法调用
DPLL(newarray2[0], variables, &newclauses2
因为整个算法返回0,如果
(DPLL(newarray[0], variables, &newclauses2)
是 0。如果第一次调用是 1,它返回 1 也没关系。
DPLL 是从我的主要方法中调用的,如下所示:
if (DPLL(phi, variables, &claues))
{
printf("%s\n", "SATISFIABLE");
}
else
{
printf("%s\n", "UNSATISFIABLE");
}
在 c 中甚至可以像这样进行递归调用吗?
最佳答案
第二次调用可能不会发生的原因是因为 short circuit evaluation .如果第一次调用返回真值,则整个表达式为真,因此无需评估第二次调用。如果你想保证两者都被调用,你可以这样做:
int r1 = DPLL(newarray[0], variables, &newclauses);
int r2 = DPLL(newarray2[0], variables, &newclauses2);
return r1 || r2;
在这种情况下,两个调用都在返回中发生任何短路之前完成。但是,在您给出的示例中,短路评估是一个很好的优化。
关于C 方法应该调用自己递归两次,但似乎没有这样做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27889011/