Страницы

Поиск по вопросам

вторник, 25 февраля 2020 г.

Рекурсивный вывод числа наоборот

#java #рекурсия


Есть задача, написать рекурсивную процедуру для вывода на экран цифр натурального
числа в обратном порядке. Я её решил, но хочу что бы на выходе из рекурсии получалось
целое число. Вот, что я сейчас имею.

public class MyClass {
    public static int consoleInputFirstNumber() {
        Scanner scan = new Scanner(System. in );
        System.out.print("Enter number: ");
        if (scan.hasNextInt()) {
            return scan.nextInt();
        } else {
            System.out.println("Entered not number. Try again.");
            return consoleInputFirstNumber();
        }
    }

    public static void numberReverseOrder(int number) {
        if (number == 0) {
            return;
        } else {
            System.out.print(number % 10);
            numberReverseOrder(number / 10);
        }
    }

    public static void consoleOutput(int result) {
        System.out.println(result);
    }

    public static void main(String[] args) {
        int input = consoleInputFirstNumber();
        numberReverseOrder(input);
    }
}


Кто знает, что нужно что бы решить мою проблему дайте подсказку или напишите решение.
Заранее спасибо.
    


Ответы

Ответ 1



Вообще-то ваша программа вроде как работает. Она только для 0 ничего не выводит, поэтому непонятно, чего вы хотите. Но вот для разнообразия моё решение. Проще такую задачу решать, преобразовав число в строку и сведя её к выводу перевёрнутой строки. Кроме того я бы разделил преобразование строки к перевёрнутой и собственно вывод. Вот как вашу задачу можно решить рекурсивно: import java.util.Scanner; public class RecursiveReverse { public static String reverse(String str) { return str.isEmpty() ? "" : reverse(str.substring(1)) + str.charAt(0); } public static void main(String[] args) { try (Scanner scan = new Scanner(System.in)) { System.out.print("Enter number: "); System.out.println("Reversed: " + reverse(String.valueOf(scan.nextInt()))); } } }

Ответ 2



Вот мой простой ответ: static int reverse(int num){ return num<10 ?num:Integer.parseInt(String.valueOf(num%10)+reverse(num/10)); }

Ответ 3



Вариант без использования строки. Класс IntRef нужен для имитации передачи параметра по ссылке. public class RecursiveReverse { private static class IntRef { int value; public IntRef( int value ) { this.value = value; } } public static int reverse( int arg ) { IntRef result = new IntRef( 0 ); reverseRec( arg, 1, new IntRef( 0 ), result); return result.value; } private static void reverseRec( int arg, int curDepth, IntRef maxDepth, IntRef result ) { if ( arg < 10 ) { maxDepth.value = curDepth; result.value = arg; } else { reverseRec( arg/10, curDepth * 10, maxDepth, result ); result.value = result.value + (arg % 10) * maxDepth.value / curDepth; } } public static void main( String[] args ) { int[] tests = new int[] { 0, 1, 5, 10, 11, 15, 100, 123, 555, 375, 1000, 1040, 12345 }; for ( int test : tests ) { System.out.printf( "%6d | %d%n", test, reverse( test ) ); } } }

Комментариев нет:

Отправить комментарий