我最近在大学接受考试,但我遇到了一个问题。该任务的具体定义如下:
写一个递归方法(不要更改签名或参数;不允许全局变量;不要使用字符串或方法Stringbuffer;没有循环)如果零的数量为0则返回“true”数字“n”为奇数,如果零数为偶数则为“假”。
签名和参数:
public static boolean oddZeros(int n) {
}
所以:
n = 10 //true
n = 100 //false
n = 1402050 //true
n = 0 // true
n = 12 // false
你明白了......
我理解递归的概念,但我没有看到我如何计算某些东西,只给出了布尔值。我尝试在方法中添加一个计数器变量,但每当我进行递归调用时,显然该变量将被重置为其初始化。
由于这是一个非常具体的问题,到目前为止我没有找到任何解决方案。这样的方法怎么样?
答案 0 :(得分:3)
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);
}
答案 1 :(得分:3)
你不需要算什么。
你只需要注意:
如果从具有奇数个零的数字中删除0
数字,则生成的(较小的)数字不会有奇数个零。
如果从具有奇数个零的数字中删除非0
数字,则生成的(较小的)数字也会有奇数个零。
最后,作为递归的基础,如果0&lt;数字&lt; 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);
}