递归查找包括负数在内的数字总和

时间:2019-03-09 01:05:34

标签: java recursion

我正在使用Java中的递归(对我来说是一个新概念)来应对一些挑战。我目前正在研究一种递归方法,该方法给出给定长参数(n)的数字总和。预期输出:

  • 257 = 14
  • -257 = -14

我尝试编辑基本情况以仅包括1和10之间的数字,然后减少sumOfDigits()的总和,但是显然您不能使用ifelse if,或else语句中的递归方法。我被卡住了!有人可以引导我寻求解决方案吗?这是我的方法:

    public static long sumOfDigits(long n){

    long sum = n %10;
    if ( n < 10){
        return sum;
    } else {
        return sum += sumOfDigits(n%10);
    }
}

3 个答案:

答案 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);
    }
  }
}