带返回的递归方法

时间:2016-04-12 19:34:10

标签: java recursion methods sum return

我必须编写一个递归方法,该方法将计算所有偶数的总和,这些数字不能在7的间隔中用1除以参数。

我无法使用任何循环。这是我走了多远,但似乎我的陈述不正确。

有什么建议吗?

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

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

5 个答案:

答案 0 :(得分:1)

无论是否计算当前数字,都需要递归到下一个数字。

boolean divisibleBy2Not14 = ((x % 2 == 0) && (x % 7 != 0);
return (divisibleBy2Not14 ? x : 0) + (x > 0 ? specialSum(x - 1) : 0);

答案 1 :(得分:1)

如果您需要找到此类(x % 2 == 0 && x % 7 != 0)阳性(x > 0)数字的总和:

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

答案 2 :(得分:1)

递归的逻辑有两个问题:

  1. 它正在尝试返回计数而不是有效数字的总和
  2. 并且递归没有到达所有分支,因为它一到达无效的情况就会终止。
  3. 如果您想要总和,则应返回specialSum(x-1)+x而不是specialSum(x-1)+1。这是一个可行的例子:

    public static int specialSum (int x){
        if(x == 0) return 0; // ← degenerate case
        return ((x % 2 == 0) && (x % 7 != 0) ? specialSum(x - 1) + x : specialSum(x - 1));
    }
    

    您可以通过将specialSum(x - 1) + x替换为specialSum(x - 2) + x来添加一些简单的简化,因为如果x - 1是偶数,您就知道x将是奇怪的。

答案 3 :(得分:1)

你必须改变像这样的特殊方法:

select 'by sales rep' breakdown
, salesRep
, '' year
, sum(price * amountShipped) amount
from etc
group by salesRep

union

select 'by sales rep and year' breakdown
, salesRep
, convert(char(4),orderDate, 120)  year
, sum(price * amountShipped) amount
from etc
group by salesRep, convert(char(4),orderDate, 120)

etc

答案 4 :(得分:1)

接近它的一个好方法是首先将它写出来(没有三元运算符)。然后你可以看看它是否可以缩短:

   public static int summer( int n ) {
      if ( n < 2 ) {
         return 0;
      } else if ( (n % 2) == 0 ) {
         if ( (n % 7) == 0 ) {
            return summer( n - 2 ); // n-1 is odd, so skip it
         }
         return n + summer( n - 2 ); // n-1 is odd, so skip it
      } else {
         return summer( n - 1 );
      }
   }