从int中删除的方法

时间:2015-10-22 19:32:44

标签: java recursion

这是我迄今为止所能提出的。

  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)。我认为我的问题包括可能的逻辑,显然我的语法有问题,定义字符串的方法的第一行导致它重新定义每次递归,弄乱它。

2 个答案:

答案 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;
}