gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:15 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com