[英]Recursive method to count figures in a number with boolean as return
我最近在大学里进行了考试,但一直在努力解决问题。 该任务的定义非常具体,如下所示:
编写一个递归方法(不要更改签名或参数;不允许使用全局变量;不要使用String或Stringbuffer方法;不循环),如果数字“ n”中的零个数为奇数,则返回“ true”如果零的数目为偶数,则为“ false”。
签名和参数:
public static boolean oddZeros(int n) {
}
因此对于:
n = 10 //true
n = 100 //false
n = 1402050 //true
n = 0 // true
n = 12 // false
你明白了..
我了解递归的概念,但仅给定布尔值,我看不到如何计数。 我尝试在方法中添加一个计数器变量,但是每当我进行递归调用时,显然该变量将被重置为其初始化。
由于这是一个非常具体的问题,所以到目前为止我还没有找到任何解决方案。 这样的方法看起来如何?
public static boolean oddZeroes(int n) {
if (n < 10) {
return n == 0;
}
return (n % 10 == 0) ^ oddZeroes(n / 10);
}
您甚至可以将其设置为单线:
public static boolean oddZeroes(int n) {
return n < 10 ? n == 0 : (n % 10 == 0) ^ oddZeroes(n / 10);
}
而且,如果您还想处理负输入,请在开头添加类似if (n < 0) {return oddZeroes(-n);}
的内容,即:
public static boolean oddZeroes(int n) {
if (n < 0) {
return oddZeroes(-n);
}
if (n < 10) {
return n == 0;
}
return (n % 10 == 0) ^ oddZeroes(n / 10);
}
您无需计数。
您只需要注意以下几点:
如果您从具有零个奇数的数字中删除一个0
位数,则所得的(较小的)数字将不会具有零个奇数。
如果从奇数为零的数字中删除非0
位数,则所得的(较小的)数字也将为奇数零。
最后,作为递归的基础,如果0 <number <10,则它具有偶数0
s( 0
0
s),因此您的方法应返回false
。
您可以编写一个较短的实现,但是我更喜欢可读性:
public static boolean oddZeros(int n) {
if (n == 0)
return true;
else if (n < 10)
return false;
else if (oddZeros (n / 10)) {
return n % 10 != 0; // removed digit is not 0
} else {
return n % 10 == 0; // removed digit is 0
}
}
编辑:
假设输入为非负。 如果需要支持否定输入,则可以添加以下初始条件:
if (n < 0) {
return oddZeros (-n);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.