2013-12-18 4 views
0

Я пробовал это некоторое время, но не смог заставить его работать. Я пытаюсь использовать метод для преобразования целого числа без использования строк или массивов. Например, 123 следует отменить до 321 в целочисленной форме.Использование рекурсии для обращения к целому числу без использования строк

Моя первая попытка:

/** reverses digits of integer using recursion */ 
public int RevDigs(int input) 
{ 
    int reverse = 0; 
    if(input == 0) 
    { 
     return reverse; 
    } 
    int tempRev = RevDigs(input/10); 
    if(tempRev >= 10) 
     reverse = input%10 * (int)Math.pow(tempRev/10, 2) + tempRev; 
    if(tempRev <10 && tempRev >0) 
     reverse = input%10*10 + tempRev; 
    if(tempRev == 0) 
     reverse = input%10; 
    return reverse; 
}//====================== 

Я также попытался использовать это, но это, кажется, запутались средние цифры:

/** reverses digits of integer using recursion */ 
public int RevDigs(int input) 
{ 
    int reverse = 0; 
    if(input == 0) 
    { 
     return reverse; 
    } 
    if(RevDigs(input/10) == 0) 
     reverse = input % 10; 
    else 
    { 
     if(RevDigs(input/10) < 10) 
      reverse = (input % 10) *10 + RevDigs(input/10); 
     else 
      reverse = (input % 10)* 10 * (RevDigs(input/10)/10 + 1) + RevDigs(input/10); 
     } 
    return reverse; 
} 

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

+1

извините вопрос нуждается в переформатировании, мой код не показывать правильно, я исправлю, что – abysmaldan

+0

Вы что усложняет это. Я не вижу причин, по которым вам нужно будет сделать рекурсивный вызов в 'if'. Он может работать, но определенно трудно следовать и, похоже, подвержен ошибкам. – ChiefTwoPencils

ответ

5

насчет:

public int RevDigs(int input) { 
    if(input < 10) { 
     return input; 
    } 
    else { 
     return (input % 10) * (int) Math.pow(10, (int) Math.log10(input)) + RevDigs(input/10); 
     /* here we: 
      - take last digit of input 
      - multiply by an adequate power of ten 
      (to set this digit in a "right place" of result) 
      - add input without last digit, reversed 
     */ 
    } 
} 

Это предполагает input >= 0, конечно.

+0

при задании ввода 843 он вернул 78, поэтому он не работает, как планировалось. – abysmaldan

+0

, пожалуйста, см. Исправленный ответ, используя силу 10 –

+1

ах, забыл произнести результат 'pow'. теперь он работает - проверен :) –

3

Ключом к использованию рекурсии является то, что проблема, которую вы пытаетесь решить, содержит меньший экземпляр проблемы , такой же. Здесь, если вы пытаетесь изменить число 13579, вы можете заметить, что вы можете сделать его более мелкой проблемой, изменив значение 3579 (та же проблема, но меньше), умножив результат на 10 и добавив 1 (цифра, которую вы сняли). Или вы можете изменить число 1357 (рекурсивно), давая 7531, а затем добавить 9 * (некоторая мощность 10) к результату. Первой сложной задачей является то, что вы должны знать, когда остановиться (когда у вас есть 1-значный номер). Во-вторых, для этой проблемы вам нужно будет выяснить, сколько цифр число, чтобы вы могли получить право 10. Вы можете использовать Math.log10, или вы можете использовать цикл, в котором вы начинаете с 1 и умножаетесь на 10, пока оно больше вашего.

+0

Да, не разрешены петли, и мы вообще не использовали логарифмы в курсе, поэтому я не верю, что это то, чего хочет учитель. – abysmaldan

+0

@abysmaldan: Если вы не можете использовать Java 'Math.log10', напишите свой собственный и назовите его« RevDigs », это довольно прямолинейно. Это потребует циклов, но я сомневаюсь, что это имеет значение, поскольку оно не находится непосредственно в рекурсии. – ChiefTwoPencils

+1

Если вы вообще не можете использовать циклы, вы можете написать отдельную рекурсивную подпрограмму, чтобы подсчитать количество цифр! 'if n <10 return 1 else return 1 + numberOfDigits (n/10)'. – ajb

6

Как об использовании двух методов

public static long reverse(long n) { 
    return reverse(n, 0); 
} 

private static long reverse(long n, long m) { 
    return n == 0 ? m : reverse(n/10, m * 10 + n % 10); 
} 

public static void main(String... ignored) { 
    System.out.println(reverse(123456789)); 
} 

отпечатки

987654321 
0
package Test; 

public class Recursive { 
    int i=1; 
    int multiple=10; 
    int reqnum=0; 
    public int recur(int no){ 
     int reminder, revno; 

     if (no/10==0) {reqnum=no; 
     System.out.println(" reqnum "+reqnum); 
     return reqnum;} 
     reminder=no%10; 
     //multiple =multiple * 10; 
     System.out.println(i+" i multiple "+multiple+" Reminder "+reminder+" no "+no+" reqnum "+reqnum); 
     i++; 

     no=recur(no/10); 
     reqnum=reqnum+(reminder*multiple); 
     multiple =multiple * 10; 
     System.out.println(i+" i multiple "+multiple+" Reminder "+reminder+" no "+no+" reqnum "+reqnum); 
     return reqnum; 
    } 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     int num=123456789; 

     Recursive r= new Recursive(); 
     System.out.println(r.recur(num)); 
    } 

} 
+2

Просьба уточнить и объяснить ваши предложения. – deezy

0
import java.io.*; 

public class ReversalOfNumber { 
    public static int sum =0; 
    public static void main(String args []) throws IOException 
    { 
     System.out.println("Enter a number to get Reverse & Press Enter Button"); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 
     String input = reader.readLine(); 
     int number = Integer.parseInt(input); 
     int revNumber = reverse(number); 
     System.out.println("Reverse of "+number+" is: "+revNumber); 
    } 
    public static int reverse(int n) 
    {  
     int unit; 
     if (n>0) 
     { 
      unit = n % 10; 
      sum= (sum*10)+unit; 
      n=n/10; 
      reverse(n); 
     } 
     return sum; 
    } 
} 
+0

Пожалуйста, старайтесь избегать просто сдачи кода в качестве ответа и попытайтесь объяснить, что он делает и почему. Ваш код может быть не очевидным для людей, у которых нет соответствующего опыта в кодировании. Измените свой ответ, чтобы включить [пояснение, контекст и попытаться упомянуть любые ограничения, допущения или упрощения в вашем ответе.] (Https://stackoverflow.com/help/how-to-answer) –

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