我正在使用Java中的递归(对我来说是一个新概念)来应对一些挑战。我目前正在研究一种递归方法,该方法给出给定长参数(n)的数字总和。预期输出:
我尝试编辑基本情况以仅包括1和10之间的数字,然后减少sumOfDigits()
的总和,但是显然您不能使用if
,else if
,或else
语句中的递归方法。我被卡住了!有人可以引导我寻求解决方案吗?这是我的方法:
public static long sumOfDigits(long n){
long sum = n %10;
if ( n < 10){
return sum;
} else {
return sum += sumOfDigits(n%10);
}
}
答案 0 :(得分:1)
对于任何想知道的人,我都设法自己解决了! 解决方案:
public static long sumOfDigits(long n){
long sum = n %10;
if (n == 0) return 0;
if ( n >= 1 && n < 10){
return sum;
} else if (n < 0){
return sum - sumOfDigits(-n %10);
} else {
return sum + sumOfDigits(n%10);
}
}
答案 1 :(得分:1)
我相信解决方案比人们尝试的要简单:
public static long sumOfDigits(long n) {
long digit = n % 10;
if (n == digit) {
return n;
}
return digit + sumOfDigits(n / 10);
}
return
语句中的总和与符号无关,因为您要在正数上添加正数,在负数上添加负数。
棘手的部分是数字提取和测试-它取决于Java的 remainder 运算符(%)保留左侧数字的符号。在某些语言(例如Python)中,这是一个 modulus 运算符,总是返回肯定的结果。如果您使用的模数不保留符号的语言,则需要一种解决方法(例如abs()
和/或sign()
函数)。
答案 2 :(得分:0)
您可以这样做:
public class SumOfDigits {
public static void main(String[] args) {
System.out.println("257 -> " + sumOfDigits(257));
System.out.println("-257 -> " + sumOfDigits(-257));
System.out.println("0 -> " + sumOfDigits(0));
System.out.println("1 -> " + sumOfDigits(1));
}
public static long sumOfDigits(long n) {
if (n < 0) {
return sumOfDigitsOfPositive(Math.abs(n)) * -1;
}
else {
return sumOfDigitsOfPositive(n);
}
}
// Parameter n must be positive
private static long sumOfDigitsOfPositive(long n) {
if (n < 10) {
return n;
}
else {
long lastDigit = n % 10;
return lastDigit + sumOfDigitsOfPositive(n / 10);
}
}
}