我正在阅读C中加泰罗尼亚数字算法的代码,我发现这句话我不太明白。这是(递归地):
typedef unsigned long long ull;
ull catalan2(int n) {
int i;
ull r = !n;
for (i = 0; i < n; i++)
r += catalan2(i) * catalan2(n - 1 - i);
return r;
}
有人可以告诉我这句话是什么 r =!n 在这里负责?
提前谢谢!
答案 0 :(得分:2)
此:
ull r = !n;
等同于:
ull r;
if (n == 0)
r = 1;
else
r = 0;
没有分支的一种棘手的方法:
#include <limits.h>
...
ull r = 1-((unsigned)(n|(-n))>>(sizeof(n)*CHAR_BIT-1));
答案 1 :(得分:1)
x =!y表示&#34;将y评估为布尔值并返回相反的布尔值&#34;
因此,如果y为零,那么它为假,我们返回一个真值(即1)。否则,y为真,我们返回零。
答案 2 :(得分:1)
ull r = !n;
相当于ull r = n == 0 ? 1 : 0;
。当n == 0
时,它会考虑空树。 for循环计算非空树。
答案 3 :(得分:0)
r != n
表示:如果0
为非零,则分配n
,否则将1
分配给r
。