Сумма с использованием рекурсии - PullRequest
0 голосов
/ 01 апреля 2020

Извинения за базовый c вопрос, я новичок в java и застрял на этом в течение нескольких дней. Мне нужно сначала преобразовать буквы в числа, а затем использовать рекурсию, чтобы получить сумму этих чисел. Я думаю, что я близко, но я также знаю, что это очень грязно

     public static void main(String[] arg) {

    String str= "11"; 

    //////////////////////////

    String s = "helloworld";
    String t = "";
    for (int i = 0; i < s.length(); ++i) {
        char ch = s.charAt(i);
        if (!t.isEmpty()) {
            t += " ";
        }
        int n = (int)ch - (int)'a' + 1;
        t += String.valueOf(n);
    }
    System.out.println(t);

    //////////////////////////////

     int sum=0;
     int x=Integer.parseInt(t);
     int y=recursion(x);
     System.out.println("The Sum of the digits is: "+ y);

 }   

public static int recursion(int y) {
  if(y/10>=1) {
      int tempvar =y%10;
      int remain=y/10;
      return tempvar + recursion(remain); 
  }
  else {            
      return y;
  }

}}

1 Ответ

1 голос
/ 01 апреля 2020

Хорошо, прежде всего, эта строка: int x=Integer.parseInt(t); выполнит sh программу во время выполнения, потому что строка t содержит пробелов . Поэтому вам нужно удалить это:

if (!t.isEmpty()) {
     t += " ";
}

Во-вторых, синтаксический анализ строки t для int является проблемой, потому что число в строке t может быть очень, очень большим. Парсинг этого очень ... очень большого числа в int также вызовет исключение во время выполнения. Так что лучший способ сделать это - оставить его в виде строки, l oop поверх него и просто добавить в него цифры.

У меня есть два решения:

  • I l oop на t и добавление цифр.
  • Я предполагаю, что у вас есть некоторые ограничения на размер t, чтобы его можно было проанализировать как int (или long), а затем использовать рекурсию по своему усмотрению.
public class Main {
    public static void main(String[] args) {
        String s = "hew";
        String t = "";
        for (int i = 0; i < s.length(); ++i) {
            char ch = s.charAt(i);
            int n = (int)ch - (int)'a' + 1;
            t += String.valueOf(n);
        }
        System.out.println("t: "+t);


        System.out.println("sum using string: " + getSumUsingString(t));
        System.out.println("sum using int: " + getSumUsingLong(Long.parseLong(t), 0));
    }

    // the string function
    private static long getSumUsingString(String t) {
        long sum = 0;
        for (int i = 0; i < t.length(); i++) {
            sum += t.charAt(i)-48;
        }
        return sum;
    }

    // recursive function
    private static long getSumUsingLong(long num, long sum) {
        if (num==0) return sum;
        sum += num % 10;
        return getSumUsingLong(num / 10, sum);
    }
}

Примечание:

Вы можете использовать, например, BigInteger класс в Java для работы с очень большими числами, если вы действительно нужно разобрать эту строку t на число.

...