【问题标题】: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

标签: c recursion


【解决方案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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2016-05-08
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 2021-11-28
      • 1970-01-01
      • 2021-12-09
      • 2014-10-29
      相关资源
      最近更新 更多