使用递归查找x可被整除的数字之和

时间:2014-03-27 19:37:28

标签: java recursion

我想找到使用递归方法可以被x整除的数字之和

  

如果n = 10,x = 3,则代码应返回3 + 6 + 9

的总和

编写一个递归方法sumDivByX(n, x),找出所有的总和 从0到n的数字,可以被x整除。

我问我的老师,他告诉我“首先,总数应该是全局的。如果n或x == 0,你应该返回0。我只关心n是否可以被x整除。所以我只添加n到total(total + = n)if(n%x == 0)否则什么都不做。并且递归sumDivByX(n-1,x)并像往常一样返回总数。“我试图纠正它。< / p>

public static int sumDivByX(int n, int x) {
    int total = 0;
    if (n == 0 || x == 0) {
        return -1;
    }
    if (n % x >= 1) {
        return total = 0;
    } else if (n % x == 0) {
        return total += n;
    }
    return total + sumDivByX(n - 1, x);

}

当我运行程序时,我得到0

4 个答案:

答案 0 :(得分:3)

消除第二和第三个if陈述中的回报

public static int sumDivByX(int n, int x) {
    int total = 0;
    if (n == 0 || x == 0) {
        return 0;
    }
    if (n % x >= 1) {
        total = 0;
    } else if (n % x == 0) {
        total += n;
    }
    return total + sumDivByX(n - 1, x);

}

对于更精简,更紧凑的版本

public static int sumDivByX(int n, int x) {
    if (n == 0 || x == 0) {
        return 0;
    }
    return (n % x == 0 ? n : 0) + sumDivByX(n - 1, x);
}

注意 - 根据您想要的语义,您可能希望对x<=0(可能和错误?)和n==0(基本情况)进行单独检查。

答案 1 :(得分:0)

逐步执行代码,当n == 10和x == 3时,你会发现它从不递归,因为(10%3 == 1)

答案 2 :(得分:0)

当一个方法进入“return”语句时,它会在第二个if。

的情况下结束

每次运行方法时,您的总数都会被初始化为0,因此您应该考虑将其设为全局。

如果您尝试将负数用作参数

,则您的方法会生成异常

试试这个:

int total=0;
public static int subDivByX(int n, int X) {
   if (n>0 && x>0) {
      if (n%x==0){
          total += n;
      }
      return sumDivByX(n-1,x);
   } 
   else return -1;
}

答案 3 :(得分:0)

这似乎有效

private static int sumDivByX(int n,int x) {
    if (n < x || x < 1 ) {
        return 0;
    }
    int d = n/x;
    return (x * d) + sumDivByX(n - x , x);
}

递归可能会导致堆栈溢出。