C 简单递归函数

C 简单递归函数,c,recursion,C,Recursion,如果num的所有数字之和为偶数,则该递归函数必须返回1,如果该和为奇数,则返回0 请详细解释它到底做了什么,以及NOT操作符在这个特定示例中是如何工作的。我还没有看到递归调用上的NOT,这让我有点困惑 int func(int num) { if (num < 10) { if (num % 2 == 0) { return 1; } else { return 0; } }

如果num的所有数字之和为偶数,则该递归函数必须返回1,如果该和为奇数,则返回0

请详细解释它到底做了什么,以及NOT操作符在这个特定示例中是如何工作的。我还没有看到递归调用上的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
    }
}

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

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

!运算符将其参数与0进行比较:!expr等于expr==0。最后一个表达式依赖于以下事实!0==1和!1==0

在张贴的代码中,如果数字小于10,则结果为1,n为偶数,0为奇数。通过计算除以2的剩余部分来测试均匀度

相反,如果数字的位数超过1位n>=10,则函数将计算最后一位被删除的数字的结果funcnum/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;
}

请注意,上面的函数都不能正确处理负数。

请尝试在一张纸上用两个输入运行它。提示:奇数+奇数=偶数,偶数+偶数=偶数,奇数+偶数=奇数此函数工作正常。我唯一的问题是,如果我将NOT运算符应用于递归调用,它将如何工作,我标记的上一条else语句中的行对我来说不太清楚。not运算符在retrun值为TRUE或FALSE时使用函数,因为它返回一些值。因此在您的代码中,它始终为TRUE。我不清楚这种行为这正是我问题的重点。但是函数的输出总是有效的smh,我尝试了几个输入,每个答案都是正确的。尝试返回true或false,而不是0&1