这是我迄今为止所能提出的。
public static int evens(int n)
{
String num = "" + n;
if (n>1) {
if (n%2 == 0) {
return n + evens(n%10);
}
else {
int len = num.length();
num = num.substring(0, len-1);
n = Integer.parseInt(num);
return n + evens(n%10);
}
}
else {
return n;
}
}
我的逻辑是将整数作为一个字符串,然后每次除以10以在一个地方生成下一个数字(从右到左)(并且使用整数,我相信应丢弃前一个数字)。然后我试图使用%2来查找余数,如果它不是== 0,那个位置的数字是奇数,并以某种方式从字符串中消除该数字(通过取长度然后从0获取子字符串)到len-1)。我认为我的问题包括可能的逻辑,显然我的语法有问题,定义字符串的方法的第一行导致它重新定义每次递归,弄乱它。
答案 0 :(得分:1)
实际上,有一些错误主要是由冗余逻辑引起的,但它很容易得到(简化和)修复:
public static String evenDigits(int n)
{
if (n > 0) {
if (n % 2 == 0) {
return n % 10 + "" + evenDigits(n / 10);
} else {
return evenDigits(n / 10) + "";
}
} else {
return "";
}
}
请特别注意来自:
的return语句中“参数”的“切换”return n + evenDigits(n%10);
为:
return n % 10 + "" + evenDigits(n / 10);
通过返回n % 10
,您将返回当前正在处理的数字(这是您想要的)并使用n / 10
递归地发送该数字的“其余”。
不同的方法可以是,根本不使用字符串。将它与迭代方法相结合(相对于上面提出的递归方法),结果类似于以下内容:
public static int evenDigits(int n) {
int res = 0;
int mag = 0;
while (n > 9) {
int digit = n % 10;
n /= 10;
if (digit % 2 == 0) {
res += Math.pow(10, mag) * digit;
mag++;
}
}
return res;
}
答案 1 :(得分:1)
紧凑的非字符串版本:
public static int evenDigits(int n) {
return (n&1) != 0 ? evenDigits1(n/10) : n < 10 ? n : n%10 + evenDigits(n/10)*10;
}
说明:
public static int evenDigits(int n) {
if ((n & 1) != 0) {
// Last digit is odd, so remove it. Recurse on higher digits
return evenDigits(n / 10);
}
if (n < 10) {
// Single digit number is even, so we're done
return n;
}
// Keep last digit (it is even). Recurse on higher digits
return n % 10 + evenDigits(n / 10) * 10;
}