简单的递归函数误解[关闭]
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 = even
、even + even = even
、odd + even = odd
)
此功能正常工作。我唯一的问题是,如果我将 NOT 运算符应用于递归调用,它是如何工作的,我标记的最后一个 else 语句中的行对我来说不是很清楚。
当返回值为 TRUE 或 FALSE 时,NOT 运算符与函数一起使用,因为它返回一些值所以在你的代码中它总是正确的,我不清楚这种行为
这正是我的问题的重点。但是函数的输出总是有效的smh,我尝试了几个输入,每个答案都是正确的。
尝试返回 true 或 false 而不是 0 & 1
【参考方案1】:
任何奇数都可以表示为偶数和奇数之和。两个奇数之和总是偶数。
这利用了这一原则。在最后一个块中,由于num
(num%10
)的第一个数字是奇数,所以它基本上反转了func
的结果。如果返回的值是偶数,则需要添加一个奇数,将其转换为奇数。如果返回的值是奇数,那么在加上当前数字后,你会得到一个偶数。所以,这实际上翻转了func
的输出,所以放置一个非运算符也会做同样的事情。
【讨论】:
【参考方案2】:!
运算符将其参数与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;
请注意,以上函数都不能正确处理负数。
【讨论】:
以上是关于简单的递归函数误解[关闭]的主要内容,如果未能解决你的问题,请参考以下文章