2015-05-19 3 views
1

Я пытаюсь добавить цифры, используя приведенный ниже код. Например, если мой ввод 678, мой выход должен быть 3.Сумма цифр/цифрового корня с использованием Recusrion

например.

digital_root (942)
=> 9 + 4 + 2 =
> 15 ...
=> 1 + 5
=> 6

package codewars; 

     public class test { 

      static int sum(int s) 
      { 
       int n=s; 
       int add=0; 
       while(n%10 > 0)   
       { 
        add=n%10 +add; 
        n=n/10; 
        //System.out.println("num is " +n); 
       } 

       if(add/10 > 0) 
       { 
        System.out.println(add); 
        sum(add); 
        System.out.println("if block"); 
       } 


        return add; 


      } 

      public static void main(String[] args) 
      { 
      int result= test.sum(678); 
      System.out.println(result); 



      } 

      } 

Хочу вызывать функцию sum рекурсивно, пока сумма не будет состоять только из одних цифр.

+1

Возможный дубликат [Как написать рекурсивный метод для возврата суммы цифр в int?] (Http://stackoverflow.com/questions/9696853/how-to-write-a-recursive-method- to-return-the-sum-of-digits-in-an-int) – Prabhakaran

+1

Ваш алгоритм рекурсивно вызывается суммой. Но вы забываете использовать результат рекурсивного вызова. Когда вам нужно вызвать метод sum в инструкции if, вам нужно вернуть этот результат в качестве конечного результата. Поэтому просто добавьте ключевое слово return перед суммой (add). В настоящее время выполняется ваш рекурсивный вызов, но вы ничего не делаете с результатом, который является таким же, как просто удаление оператора if и его тела. Добавлен правильный код для моего ответа ниже. – Juru

+0

@Juru Спасибо. Код работает сейчас –

ответ

2

что-то более близкое к вашему собственному алгоритму. Нигде не использует mod, вместо этого он преобразует число в строку и добавляет все числовые значения символов вместе для каждого прохождения. Легче понять, но, возможно, не так, как исполнитель («быть испытанным»).

public class Test{ 

      static int sum(final int s) 
      { 
       final String numbers = String.valueOf(s); 
       final int amountOfDigits = numbers.length(); 
       int sum = Character.getNumericValue(numbers.charAt(0)); 
       for(int i = 1; i < amountOfDigits; i++) { 
        sum += Character.getNumericValue(numbers.charAt(i)); 
       } 

       if(sum > 9) { 
        return sum(sum);  
       } else { 
        return sum; 
       } 
      } 

      public static void main(String[] args) 
      { 
      int result = Test.sum(678); 
      System.out.println(result); 



      } 
} 

Чтобы исправить свой собственный код, просто добавьте возврат к рекурсивному вызову. В противном случае вы всегда возвращаете сумму всех цифр исходного номера, которую вы хотите сделать только в том случае, если осталось только одна цифра.

static int sum(int s) 
      { 
       int n=s; 
       int add=0; 
       while(n%10 > 0)   
       { 
        add = (n%10) +add; 
        n = n/10; 
        System.out.println("num is " +n); 
       } 

       if(add/10 > 0) 
       { 
        System.out.println(add); 
        return sum(add); 
       } 
       return add; 


      } 
+0

Только для записи. Метод, использующий mod вместо персонажей, на 25% быстрее :-). – Juru

2

Вы можете попробовать следующий код -

public class DigitalRoot{ 

    public static void main(String[] args){ 

     System.out.println("Digital Root 9: "+findDigitalRoot(9)); 
     System.out.println("Digital Root 942: "+findDigitalRoot(942)); 
     System.out.println("Digital Root 1942: "+findDigitalRoot(1942)); 
     System.out.println("Digital Root 1876: "+findDigitalRoot(1876)); 
    } 

    public static int findDigitalRoot(int n) { 

     if(n>10){ 

      int sum = n%10 + findDigitalRoot(n/10); 
      if(sum>10){ 
       return findDigitalRoot(sum); 
      }else{ 
       return sum; 
      } 
     }else{ 
      return n; 
     }  
    } 
} 
+0

OK. Можете ли вы сообщить мне, в чем проблема в моем коде? Почему я не могу вызывать функцию суммы рекурсивно –

1

Это охватывает случай, когда внутренний результат больше, чем 10:

static int sum(int s) { 

    if (s >= 10) { 
     int t = s % 10 + sum(s/10); 
     if (t >= 10) { 
      return sum(t); 
     } else { 
      return t; 
     } 

    } else { 
     return s; 
    } 
} 

Следующие компактная функция дает тот же результат:

static int sum(int s) { 

    if (s < 10) { 
     return s; 
    } 

    return sum(s % 10 + sum(s/10)); 
} 
0

я узнал о более легком растворе , используя математическое соотношение о сумме цифр

static int sum(int n) { 
    return (n - 1) % 9 + 1; 
} 

PS: просто попробуйте в консоли.

Смежные вопросы