Java - 使用支票号进行递归求解

时间:2018-04-13 12:02:06

标签: java recursion

我遇到了涉及递归的练习

问题:

写一个递归函数,它返回一个整数,"校验位"。通过计算传入整数中所有数字的总和来计算该校验位。但是,如果结果大于或等于10(即,大于一个数字),则应使用结果作为输入再次执行计算。因此,直到返回的最终数字将是一个数字;这个数字是"校验位"。

示例:

号码869419 ----> 8 + 6 + 9 + 4 + 1 + 9 = 37 - > 3 + 7 = 10 - > 1。

*我已经达成的最贴近的解决方案:*

public static int Bik (int n) {
    int sum=0;
    if (n/10 == 1 || n==1) {
        return 1;
    }
    else {
        if (n%10 != 0) {
            return Bik((n/10) + (n%10));
        }
        return (n);
    }
}

public static void main(String[] args) {
    System.out.println(Bik(1892));
}

5 个答案:

答案 0 :(得分:1)

您在Bik方法的第1行遇到一个问题:

每次调用它时,变量sum都定义为0,因此它永远不会改变。同样在您的代码中,您实际上从未对上一次迭代中的值求和。我可以提供的解决方案是使用前一次迭代的总和传递另一个参数:

public static int Bik (int n, int sum) {
    // You get the value of the last digit and sum it to your total
    sum += n%10;
    // This validation is to know if there is only 1 digit left  
    if (n>9) 
        // The required recursion
        return Bik(n/10, sum); 
    //In case the sum is higher than 9 the recursion is called again, otherwise it returns the sum
    return sum>9 ? Bik(sum, 0) : sum;
}

public static void main(String[] args) {
    System.out.println(Bik(1892, 0));
}

请注意,此解决方案也适用于递归必须像189235一样运行多次的数字。此外,我使用了三元运算符。您可以了解有关它的更多信息here但如果您不喜欢它,您也可以使用常规if声明

答案 1 :(得分:0)

首先,您需要检查输入是否大于10,否则只返回输入。

if(input < 10) { //no computation required return input
     return input;
}

然后,如果输入大于10.您需要获取组成输入的每个数字。要获得一个数字,只需模10 input%10。这将为您提供最后一位数字。然后将输入除以10并重新操作以获得下一个数字。重复此操作,直到输入低于10.这里您已获得所有数字

while(input > 9) { // until input is lower than 10
    int newDigit = input % 10; //find a digit
    digits.add(Integer.valueOf(newDigit);  //ass it to a list
    input /= 10;  //reduce input
}
digits.add(Integer.valueOf(input)); //add the last input digit

必须对列表中的所有元素求和以获得结果

for(Integer i : digits) { //sum all digits
    result += i;
}

最后返回此结果的计算结果。通过这样做你使用递归,如果结果低于10它将返回,如果它更大它将再次计算。

return compute(result); // return the computed result

这些步骤的总和应该是:

public int compute(int input) {
    if(input < 10) { //no computation required return input
         return input;
    } else {
        List<Integer> digits = new ArrayList<Interger>(); //will contains the digit composing input
        int inComputationInt = input; //a copy of input that will be modified
        int result = 0; //the resulting sum of digit

        while(inComputationInt > 9) { //obtain every digit in input
            int newDigit = inComputation % 10;
            digits.add(Integer.valueOf(newDigit));
            inComputation /= 10;
        }
        digits.add(Integer.valueOf(inComputation);

        for(Integer i : digits) { //sum all digits
            result += i;
        }

        return compute(result); // return the computation of result
    }
}

答案 2 :(得分:0)

编辑后 - 现在更加清晰。

int checkDigit(int n) {
    // Any single-digit is the check digit.
    if (n < 10) return n;
    // More than one digit - add them up.
    String digits = Integer.toString(n);
    int sum = 0;
    for (int i = 0; i < digits.length(); i++) {
        sum += digits.charAt(i) - '0';
    }
    // Check that sum.
    return checkDigit(sum);
}

private void test(int n) {
    System.out.println("Check difgit for "+n+" = "+checkDigit(n));
}

public void test(String[] args) {
    int[] tests = {86941,869419,189,1892};
    for(int n: tests) {
        test(n);
    }
}

答案 3 :(得分:0)

public int digitSum(int n) {
 if(n < 10) return n;
 return n % 10 + digitSum(n / 10);
}

首先,您需要一个基本案例,在这种情况下,这是您提供的数字,如果小于10,则返回给定的数字。

第二个return语句采用最右边的数字(取模数n%10)并将其保存到堆栈中,然后再次调用该方法,但使用(n / 10),该计算将删除最右边的数字,因为您已经使用过它在模数计算中,因此您不再需要它。将新数字传递给方法,然后重复此过程,直到您的数字小于10。

希望这可以澄清一点。

答案 4 :(得分:-1)

将此方法包含在您的代码中,将数字传递给digitSum

static int digitSum(int n)
{
    int sum = 0;

    // Loop to do sum while
    // sum is not less than
    // or equal to 9
    while (n > 0 || sum > 9) 
    {
        if (n == 0) {
            n = sum;
            sum = 0;
        }
        sum += n % 10;
        n /= 10;
    }
    return sum;
}