C 方法应该调用自己递归两次,但似乎没有这样做

标签 c recursion

我是 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/

相关文章:

c++ - 销毁整个 AVL 树

javascript - 将深层对象映射到新对象的更好方法

c - 仅使用一个辅助递归函数求最长递增子序列的长度

c++ - 使用预处理器指令从数学方程式生成错误值

C 守护进程 - 释放和删除锁定文件

c++ - 在 C++ 中递归执行 Linux 管道命令

c# - 查找嵌套和排序

c - IPv6 绑定(bind)失败

c - scanf single char 不适用于我的循环

c - 用结构体写入结构体