简单的递归函数误解[关闭]

Posted

技术标签:

【中文标题】简单的递归函数误解[关闭]【英文标题】:Simply recursive function misunderstanding [closed] 【发布时间】:2019-01-12 02:02:05 【问题描述】:

如果num 的所有数字之和为偶数,则此递归函数必须返回1,如果和为奇数,则返回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
    

【问题讨论】:

尝试在一张纸上运行它并输入几个输入。 (提示:odd + odd = eveneven + even = evenodd + even = odd 此功能正常工作。我唯一的问题是,如果我将 NOT 运算符应用于递归调用,它是如何工作的,我标记的最后一个 else 语句中的行对我来说不是很清楚。 当返回值为 TRUE 或 FALSE 时,NOT 运算符与函数一起使用,因为它返回一些值所以在你的代码中它总是正确的,我不清楚这种行为 这正是我的问题的重点。但是函数的输出总是有效的smh,我尝试了几个输入,每个答案都是正确的。 尝试返回 true 或 false 而不是 0 & 1 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

相反,如果数字多于 1 位 (n &gt;= 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;

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

【讨论】:

以上是关于简单的递归函数误解[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释这个递归函数吗? [关闭]

需要把它变成一个递归函数[关闭]

gcc 是不是优化递归函数?怎么做? [关闭]

使用带有一个参数函数的递归查找数字的平方[关闭]

从分层数组Ruby生成平面数组的递归函数[关闭]

递归,匿名函数