Как использовать рекурсивный метод для возврата суммы цифр в строке? - PullRequest
0 голосов
/ 26 октября 2018

Итак, у меня есть вопрос, который просит меня написать метод, которому передается строка, состоящая из цифр, и этот метод должен возвращать сумму этих цифр.Поэтому, если String равен «123», мой метод должен вернуть значение 6. Если передана пустая строка, мой метод должен вернуть ноль.Он просит меня использовать рекурсию.Вот что у меня есть:

public class Q2 {


public static void main(String[] args) { 

String s = "135";
System.out.println(sumDig(s));
}

public static String sumDig(int num)
{
  int i = Integer.parseInt(num);
  int sum = 0;
  if (i == 0)
    return sum;
  int sum = num%10 + sumDig(num/10);
  return sum;
  } 
}

У меня просто есть небольшая проблема, пытаясь понять, нахожусь ли я на правильном пути, я знаю, что это совершенно шатко, и рекурсия все еще очень странна для меняпоэтому любая помощь действительно ценится.Спасибо!

Редактировать: я не думаю, что это дубликат любых других проблем, спрашивающих, как найти сумму цифр с помощью рекурсии, это очень похоже, но отличается, потому что просит найти сумму цифр из Строка .

Ответы [ 6 ]

0 голосов
/ 26 октября 2018

Предполагая, что строка состоит из всех цифр, приведенная ниже строка работает с длиной строки больше, чем Integer.MAX_VALUE

public static void main(String[] args) {
    String s = "123344566777766545";
    long i = sumDig(s);
    System.out.println(i);
}

public long sumDig(String s) {
    return sumDigits(s.toCharArray(), 0);
}

public long sumDigits(char[] chars, int index) {
    if (index == chars.length - 1) {
        return chars[index] - '0';
    }
    return sumDigits(chars, index + 1) + (chars[index] - '0');
}
0 голосов
/ 26 октября 2018

В комментариях ниже я хочу, чтобы вы увидели логические и синтаксические ошибки, которые вы сделали:

public static String sumDig(int num) {
    // the return type should be int and not String
    // the parameter num should be String and not int

    int i = Integer.parseInt(num);
    int sum = 0;
    if (i == 0)
        return sum;
    int sum = num%10 + sumDig(num/10);
    // sum has been previously declared as int, so int is not required in the above line
    // the number is i and this should be used and not num (which is a String)
    // in the calculations
    // num/10 cannot be used as a parameter of sumDig because sumDig needs
    // a String parameter

    return sum;
}

Это не значит, что если вы сделаете все предложенные исправления, то метод будет работать как положено. Например, что происходит, когда строка null и т. Д.?

0 голосов
/ 26 октября 2018

Ключевая проблема, на которую указывают люди, заключается в том, что вы инвертировали сигнатуру вашего метода:

public static String sumDig(int num)

, которая должна быть:

public static int sumDig(String num)

Давайте также обратимся к другой проблеме:вы взяли данные, которые могли обрабатывать напрямую, превратили их во что-то более сложное и обработали их.Давайте действовать непосредственно на то, что вам вручено:

public class Q2 {

    public static int sumDig(String digits) {

        int sum = 0;

        if (! digits.isEmpty()) {
            sum += Character.getNumericValue(digits.charAt(0)) + sumDig(digits.substring(1));
        }

        return sum;
    } 

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

ИСПОЛЬЗОВАНИЕ

% java Q2 123
6
%
0 голосов
/ 26 октября 2018

Это три варианта рекурсивных методов, различающихся по параметрам и типу возвращаемого значения, но все они выполняют одну и ту же задачу: добавление номера ввода и печать вывода.

// Recursive method where parameter is int and return type String
public static String getSumStr(int n) {
    n = n < 0 ? -n : n; // takes care of negative numbers
    if (n < 10) {
        return String.valueOf(n);
    }
    return String.valueOf(n % 10 + Integer.parseInt(getSumStr(n / 10)));
}

// Recursive method where parameter and return type both are int
public static int getSum(int n) {
    n = n < 0 ? -n : n; // takes care of negative numbers
    return n < 10 ? n : (n % 10 + getSum(n / 10));
}

// Recursive method where parameter and return type both are String
public static String getSumStr(String s) {
    if (s == null || s.length() == 0) {
        return "0";
    }
    if (s.length() == 1) {
        return s;
    }
    return String.valueOf(Integer.parseInt(s.substring(0, 1))
            + Integer.parseInt(getSumStr(s.substring(1, s.length()))));
}
0 голосов
/ 26 октября 2018

Я дам вам подсказку: что произойдет, если вы сделаете цикл for над символами в строке и добавите цифры таким образом?Я бы предложил попробовать написать такой for цикл.Вот пример того, о чем я говорю (с извинениями за то, что он в C #, а не в Java - хотя синтаксис очень похож):

string s = "123";

int sum = 0;

for (int i = 0; i < s.Length; i++)
{
    sum += int.Parse(s[i].ToString());
}

После этого, как бы вы написали рекурсивную функциюэто эквивалентно циклу for?

0 голосов
/ 26 октября 2018
// TODO not working with negative numbers
public static int sumDig(String str) {
    return str.isEmpty() ? 0 : str.charAt(0) - '0' + sumDig(str.substring(1));
}

public static int sumDig(int num) {
    return Math.abs(num) < 10 ? Math.abs(num) : (Math.abs(num) % 10 + sumDig(num / 10));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...