如果1
的所有数字之和为偶数,并且该总数为奇数,则此递归函数必须返回num
。返回0
。
请详细说明它的确切功能以及该特定示例中NOT运算符的工作方式。我还没有看到不在递归调用上,这让我有些困惑。
int func(int num) {
if (num < 10) {
if (num % 2 == 0) {
return 1;
} else {
return 0;
}
}
if ((num % 10) % 2 == 0) {
//roughly clear, but I'll be glad to receive some opinions about that to be sure
return func(num / 10);
} else {
return !func(num / 10); //this line is not clear for me
}
}
答案 0 :(得分:2)
任何奇数都可以表示为偶数和奇数之和。两个奇数之和总是偶数。
这利用了这一原理。在最后一个块中,由于num
(num%10
)的第一位是奇数,因此基本上将func
的结果求反。如果返回的值是偶数,则需要添加一个奇数,将其转换为奇数。如果返回的值是奇数,则在加上当前数字后,您将得到一个偶数。因此,这实际上会翻转func
的输出,因此放置一个not运算符也会做同样的事情。
答案 1 :(得分:0)
!
运算符将其自变量与0
进行比较:!expr
等效于expr == 0
。最后一个表达式取决于!0 == 1
和!1 == 0
的事实。
在发布的代码中,如果数字小于10
,则结果为1
是n
是偶数,而0
是奇数。通过计算除以2
的除法余数来测试均匀度。
相反,如果数字的位数超过1位(n >= 10
,则该函数计算除去最后一位数字func(num / 10)
的数字的结果,如果n
为偶数,因为在总和上添加偶数不会改变其偶数,并且如果n
为奇数,则返回相反的数字,因为将最后一位奇数相加会改变总和的偶数。
计算数字总和并检查其均匀性似乎更简单易读:
int func(int num) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum & 1;
}
这里是仅计算最低有效位的另一种选择:
int func(int num) {
int odd = 0; // default to even
while (num > 0) {
odd ^= num & 1; // invert if current digit is odd
num /= 10; // drop last digit
}
return odd;
}
请注意,上述所有函数均不能正确处理负数。