简单的递归函数误解

时间:2018-08-04 11:26:14

标签: c recursion

如果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
    }
}

2 个答案:

答案 0 :(得分:2)

任何奇数都可以表示为偶数和奇数之和。两个奇数之和总是偶数。

这利用了这一原理。在最后一个块中,由于numnum%10)的第一位是奇数,因此基本上将func的结果求反。如果返回的值是偶数,则需要添加一个奇数,将其转换为奇数。如果返回的值是奇数,则在加上当前数字后,您将得到一个偶数。因此,这实际上会翻转func的输出,因此放置一个not运算符也会做同样的事情。

答案 1 :(得分:0)

!运算符将其自变量与0进行比较:!expr等效于expr == 0。最后一个表达式取决于!0 == 1!1 == 0的事实。

在发布的代码中,如果数字小于10,则结果为1n是偶数,而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;
}

请注意,上述所有函数均不能正确处理负数。