递归 - 查找数字中偶数位的数量

时间:2016-11-11 13:39:36

标签: java recursion

我遇到了这个问题。我应该在数字中找到偶数位数。

例如,如果数字是146,则有2个偶数位。

如果数字是802,则有3个偶数位。

我被告知n%10是最右边数字的值。 n / 10包含除最右边数字以外的所有数字。

public static int countEvenDigits(int n) {

     int rightDigit =  n % 10;
     int count= 0;


     if (rightDigit / 10 == 0) {
           count++;
     } 

     return countEvenDigits(count);
 }

4 个答案:

答案 0 :(得分:1)

使用递归,你可以这样做

int calcRec(int num) {

    if (num / 10 == 0) {
        return num % 2 == 0 ? 1 : 0;
    }else{
        return (num % 10 % 2 == 0? 1:0)+calcRec(num/10);
    }

}

但它不适合使用递归。

答案 1 :(得分:1)

另一个答案:

public static int countEvenDigits(int number) {
    if (number == 0) return 0;
    int lastDigit = number % 10;
    int firstDigits = number / 10;
    if (lastDigit % 2 == 0) {
        return 1 + countEvenDigits(firstDigits);
    } else {
        return 0 + countEvenDigits(firstDigits);
    }
}

递归总是需要一个或多个“基本情况”,递归停止(在这种情况下,没有数字);以及一个或多个“递归案例”,您继续处理较小的问题(使用firstDigits)。

我同意@kimreik认为这不是一个很好的递归使用(因为问题可以通过while循环更好地解决);但这是一个非常典型的例子,当我开始学习编程递归时,我怀疑OP正在做。

答案 2 :(得分:0)

好的,使用递归处理系列的想法是你定义一个处理并从集合中删除一个元素的函数。看到您对数字感兴趣,您有2个选项可以从给定的int定义您的集合。

第一个选项是将int转换为字符串并将每个字符强制转换为int。这是我在下面实施的

或者你可以用你的基数(10)除以数字的重要性(0是最右边的数字并向左计数)。或者更有说服力的是kimreik通过整数除法顺序减少数字。 (142/10/10 == 142/100 == 1 ==“142”[0])......

将整数转换为字符串的语法是Integer.toString(int)。这将非常有用,因为它允许我们在不进行任何数学运算的情况下访问每个数字,并且还允许我们获取可以传递给递归方法的下一个实例的子字符串。

现在我们要处理数组,我们需要解决递归的基本原理。递归有三个部分。这些部分如下,一些起始状态或初始值,基本情况和递归步骤。

对于这个问题,我们必须设置偶数位数的初始值,我们将给出一个要处理的字符串。我们将从0开始计数,但它将是传递给我们方法的每次调用的变量。

我们的基本情况是空刺,这是一个空白数字。其中包含0个偶数。因为我们反复出现空集,所以这种类型的算法称为还原。

现在我们的递归步骤就是一切真正发生的地方。它必须从我们的字符串中读取一个数字,然后通过将剩余的数字传递给函数的下一个实例将其从字符串中删除。

既然我们知道我们需要做什么,那么函数看起来像什么?

public class HelloWorld{
    public static int recursiveGetEvenDigits(String arg){
        int count = 0;
        if(arg.length()<1){
             return(0); // base case
        }
        else{
             count = Character.getNumericValue(arg.charAt(0))%2 == 0 ? 1 : 0; //If else shorthand
             return(count+recursiveGetEvenDigits(arg.substring(1)));
        }
    }
    public static int getEvenDigits(int n){ // provide user arguments
        return(recursiveGetEvenDigits(Integer.toString(n))); // set initial conditions
    }
     public static void main(String []args){
        System.out.println(getEvenDigits(142));
     }
}

只是为了好笑,整个if else逻辑可以用我上面使用的相同速记再次缩减为一行。

public class HelloWorld{
    public static int recursiveGetEvenDigits(String arg){
        return arg.length() < 1 ? 0 : (Character.getNumericValue(arg.charAt(0)) % 2 == 0 ? 1 : 0)+recursiveGetEvenDigits(arg.substring(1));
    }
    public static int getEvenDigits(int n){ // provide user arguments
        return(recursiveGetEvenDigits(Integer.toString(n))); // set initial conditions
    }
    public static void main(String []args){
        System.out.println(getEvenDigits(142));
    }
}

打印2

答案 3 :(得分:0)

这是一个快速的伪代码

function sumEven(int num){
        if(num==0)
            return 0;

        int var =num%10;

        if(var % 2)
            return var+(num/10)
        else
            return 0+(num/10)
}