递归java - 测试是两个整数相等的布尔函数的总和

时间:2016-06-11 10:01:19

标签: java recursion

我编写了一个接受两个整数的递归函数。如果第一个数字位数等于第二个数字,则该函数返回true,否则该函数返回false。

该函数始终返回true。

我做错了什么?

代码:

public static boolean amountEqual(int num1, int num2) {
    int sum1 = 0, sum2 = 0;

    if (num1 == 0 && num2 == 0 && sum1 == sum2)
        return true;
    else if (num1 == 0 && num2 == 0 && sum1 != sum2)
        return false;

    sum1 += num1 % 10;
    sum2 += num2 % 10;

    return amountEqual(num1 / 10, num2 / 10);
}

感谢的

3 个答案:

答案 0 :(得分:3)

  

我做错了什么?

您使用的sum始终为零。您需要找到一种方法来传递sum1sum2,以便最终调用可以根据所有先前的调用做出决定。

这样做的一种方法是使用四个参数创建递归函数,并添加一个双参数重载来启动递归链:

public static boolean amountEqual(int num1, int num2) {
    return amountEqual(num1, num2, 0, 0);
}
private static boolean amountEqual(int num1, int num2, int sum1, int sum2) {
    ... // your recursive code goes here
}

另一种方法是计算数字差异,即num1中的数字总和减去num2中的数字总和,如果差异为零则返回true

public static boolean amountEqual(int num1, int num2) {
    return digitDifferential(num1, num2) == 0;
}
private static int digitDifferential(int num1, int num2) {
    return (num1 != 0 || num2 != 0)
    ? num1%10 - num2%10 + digitDifferential(num1/10, num2/10)
    : 0;
}

答案 1 :(得分:0)

首先,你的问题不清楚。我假设如果两个数字的数字总和相等,你希望函数返回true。

其次,你假设数字长度相同而且可能不是。

第三,您没有将sum1sum2作为参数传递。

更简单的方法是制作两个函数,如:

public static int digitSum(int num) {
    if (num > 0) {
        return num % 10 + digitSum(num / 10);
    }
    else
        return 0;
}

public static boolean amountEqual(int num1, int num2) {
    return digitSum(num1) == digitSum(num2);
}

答案 2 :(得分:0)

每次调用amountEqual方法时,

代码的前两行 它用零初始化两个新变量 让我们跟踪你的递归

System.out.println(amountEqual(18,26));
      /* F(20,30) = F(18/10,26/10) [sum1 = 8 , sum2 = 6] 
           re init sum1 = 0 , sum2 =0

            F(1,2)  = F(1/10,2/10) [ sum1 = 1 , sum2 = 2] 
           re init sum1 = 0 , sum2 = 0 
                    F(0,0) = true */