Java递归总数不能被特定数字整除的数字

时间:2016-04-25 12:49:52

标签: java recursion sum

我必须找到使用递归不能被7整除的所有偶数的总和。我尝试了这段代码,但似乎我在某处犯了错误,因为它返回0:

public static void main(String[] args) {

System.out.println(specialSum(50));
}
public static int specialSum(int a) {

    if ((a >= 1) && ((specialSum(a-1))%7 !=0)) {
        return a + specialSum(a -1);
    } else{
        return 0;
    }

    }
}

7 个答案:

答案 0 :(得分:1)

而不是if ((a >= 1) && ((specialSum(a-1))%7 !=0))尝试if ((a >= 1) && (a%7) !=0)),就像现在一样,您永远不会检查原始a值是否不能被7整除,您的第一次检查始终是{ {1}} - 1。

答案 1 :(得分:1)

在递归中,你只需要关注当前步骤,你不应该在条件中使用specialSum(a -1)。这是下一步,你应该只关注当前步骤后调用它。

您应该只应用两个规则来成功:仅将当前数字添加到nexts - 如果他们是平均的话 - 如果它们不能被7整除。

public static int specialSum(int a) {
    if(a <= 1) // Final Case.  
    {
        System.out.print(" 0 = ");
        return 0;
    }


    if(a%2 != 0) // Even Number, do not sum, call next step
    {
        return specialSum(a-1);
    }
    else 
    { 
        if(a % 7 == 0){ // Divisible by 7  Do not sum, call next step.
            return specialSum(a-1);
        }
        else // NOT divisible by 7 nor by 2, add it to the next step
        {
            System.out.print(a+ " + ");
            return a + specialSum(a-1);
        }

    }

}

输出:     50 + 48 + 46 + 44 + 40 + 38 + 36 + 34 + 32 + 30 + 26 + 24 + 22 + 20 + 18 + 16 + 12 + 10 + 8 + 6 + 4 + 2 + 0 = 566

答案 2 :(得分:0)

你的代码错了。

代码中的条件(specialSum(a-1))%7 !=0)会在49时调用a=50的方法。这会调用48的方法,该方法会调用47,依此类推a=1。然后,它需要0不大于或等于 1,因此它返回0。现在,任何数字0%n0。因此,您将0作为输出。

将您的方法更改为以下内容:

public static int specialSum(int a) {
    if(a<=2) return 2; // base case
    else if(a%7==0) return specialSum(a-2); // if it is divisible by 7, then do not add it, and call the method for a-2.
    else return a+specialSum(a-2); // else add the number, and get the answer for a-2.
}

答案 3 :(得分:0)

这对我有用。第一个if确保只取偶数。然后第二个if确保只有总和,如果不能被7整除。最后if对结果求和。

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

public static int specialSum(int max, int current){
    if(max % 2 == 1)
        max -= 1;
    if(max % 7 != 0)
        current += max;
    if(max >= 1){
        max -= 2;
        return specialSum(max, current);
    }
    return current;
}

返回566。 等于:50 + 48 + 46 + 44 + 40 + 38 + 36 + 34 + 32 + 30 + 26 + 24 + 22 + 20 + 18 + 16 + 12 + 10 + 8 + 6 + 4 + 2.

答案 4 :(得分:0)

public static int specialSum(int a) {

      if ( a % 7 !=0 && a%2==0 ) {
        return a + specialSum(a - 2);
    } else {
        if (a > 2  ) {
            a=a-2;
            return a + specialSum(a - 2);
        } else {
            return 0;
        }
    }
}

答案 5 :(得分:0)

在这里你有一行解决方案,你应该有一个案例来停止递归,在你的情况下你停止递归在49,因为它可以被7整除,你不会考虑到数字少超过49

main()
{
    specialSum(50, 7);
}

 public static int specialSum(int a, int toDivide)
 {
    return (a == 0) ? 0 : (a >= 1 && a%2 == 0 && a%7 != 0) ? a + specialSum(a - 1, toDivide) : specialSum(a - 1, toDivide);
 }

答案 6 :(得分:0)

您需要检查a是否可以被7整除,因此您应该使用if ((a>=1) && (a%7) !=0))来确保检查基本条件。