我想找到使用递归方法可以被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
。
答案 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);
}
递归可能会导致堆栈溢出。