admin / 15.06.2018

Ответы@Mail.Ru: Java Факториал

Рекурсия

Язык Java поддерживает рекурсию. Рекурсия в программировании — это когда метод вызывает сам себя. В таком случае метод называют рекурсивным.

Классический пример использования рекурсии, который показывают во всех учебниках по программированию — вычисление факториала числа. Факториал числа N — это произведение всех целых чисел от 1 до N. Например, возьмём число 3 и вычислим его факториал. У нас получится 1 * 2 * 3 = 6. Теперь напишем метод на Java в отдельном классе:

Вызовем рекурсивный метод:

Теперь, если вводить числа в текстовом поле, то получим следующие результаты:

Факториал 3 равен 6 Факториал 4 равен 24 Факториал 5 равен 120 и т.д.

Понять, как работает метод, довольно трудно, можно всю голову сломать. Однако попробуем. При вызове метода fact() с аргументом, равным 1, вернётся 1. Тут пока понятно. При других числах возвращается fact(n — 1) * n. Получается, что нужно ещё раз вызвать метод fact(). И так происходит до тех пор, пока не дойдёт до единицы. При этом промежуточные значения умножаются.

Когда метод вызывает сам себя, новым локальным переменным и параметром выделяется место в стеке и код метода выполняется с этими новыми начальными значениями. При каждом возврате из рекурсивного вызова старые локальные переменные и параметры удаляются из стека, и выполнение продолжается с момента вызова внутри метода.

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

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

При использовании рекурсивных методов нужно смотреть, чтобы в программе был оператор if для выхода из рекурсивного метода без выполнения рекурсивного вызова. Иначе метод никогда не выполнит возврат.

Рассмотрим ещё один пример вывода первых элементов массива. Создадим отдельный класс с рекурсивным методом:

Запустив код мы увидим:

[0] 0 [1] 1 [2] 2 [3] 3 [4] 4

Реклама

Статья проплачена кошками — всемирно известными производителями котят.

Если статья вам понравилась, то можете поддержать проект.

Java Примеры — факториала

Java Примеры

Факториал положительного целого числа (на английском языке: факториала) все меньше и равно произведению числа положительного целого числа, и имеют факториал 0 равен 1. Дать натуральное число п факториал п!.

Т.е. п! = 1 × 2 × 3 × … × п. Факториал может также рекурсивно :! 0 = 1, п = (п-1) × п !!.

Java Примеры — факториала

Следующий пример демонстрирует реализацию кода факторного Java:

/* author by w3cschool.cc MainClass.java */ public class MainClass { public static void main(String args[]) { for (int counter = 0; counter <= 10; counter++){ System.out.printf(«%d! = %d\n», counter, factorial(counter)); } } public static long factorial(long number) { if (number <= 1) return 1; else return number * factorial(number — 1); } }

Приведенный выше код выполняется выход:

0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800

Java Примеры

Java Notes

java.math.BigInteger

Unbounded range. To work with integers that are larger than 64 bits (the size of a ), use . This class represents unbounded integers and provides a number of methods for doing arithmetic with them.

Overflow in standard arithmetic. The problem with arithmetic using ints (or longs) is that, if the value becomes too large, Java saves only the low order 32 (64 for longs) bits and throws the rest away. For example, we can use the maximum value that can be stored in an int as an example. Both of the following operations can’t possibly fit into an int, but the arithmetic doesn’t produce an error, it produces a result!

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
// numbers/TestOverflow.java — Show int overflow and BigInteger solution. // Fred Swartz — 2004-12-03 import java.math.BigInteger; public class TestOverflow { public static void main(String[] args) { int bad = 2000000000; //Close to int max value. System.out.println(«bad = » + bad); System.out.println(«bad + 1 = » + (bad + 1)); System.out.println(«bad * 3 = » + (bad * 3)); System.out.println(«bad * 4 = » + (bad * 4)); BigInteger good = BigInteger.valueOf(2000000000); System.out.println(); System.out.println(«good = » + good); System.out.println(«good.add(BigInteger.ONE) = » + good.add(BigInteger.ONE)); System.out.println(«good.multiply(BigInteger.valueOf(3)) = » + good.multiply(BigInteger.valueOf(3))); System.out.println(«good.multiply(BigInteger.valueOf(4)) = » + good.multiply(BigInteger.valueOf(4))); } }

Produces this output. If a result exceeds Integer.MAX_VALUE (2,147,483,647), the result will be wrong, but Java doesn’t report an error! The BigInteger results are correct.

Вычислить факториал на Java

But you do have to put up was some seriously ugly syntax.

bad = 2000000000 bad + 1 = 2000000001 bad * 3 = 1705032704 // Smaller? bad * 4 = -589934592 // Negative?!!! Overflowed into sign bit. good = 2000000000 good.add(BigInteger.ONE) = 2000000001 good.multiply(BigInteger.valueOf(3)) = 6000000000 good.multiply(BigInteger.valueOf(4)) = 8000000000

Omitted features.BigInteger methods ignored in this summary: bit operations, random numbers, and prime testing.

Example

See Example — Factorial for a use of .

Constructors and Methods

Assume

BigInteger bi, bi1, bi2, bi3, bi4; BigInteger[] bia; // array holding division result and remainder. String s; int i; long lng; float f; double d;

Create BigInteger with decimal value represented by decimal String s.
Predefined value 1.
Predefined value 0.
Use this factory method to create BigIntegers from numeric expressions. An parameter will be automatically promoted to long.
Returns BigInteger absolute value.
Returns sum of bi2 and bi3.
Returns division of bi2 and bi3.
Returns array of two BigIntegers representing the result of division and remainder of bi2 and bi3.
Returns greatest common divisor of bi2 and bi3.
Returns maximum of bi2 and bi3.
Returns minimum of bi2 and bi3
Returns remainder after dividing bi2 by bi3
Returns product of bi2 and bi3.
Returns bi2 to the bi3 power.
Returns remainder of dividing bi2 by bi3. May be negative.
-1 for neg numbers, 0 for zero, and +1 for positive.
Returns bi2bi3.
Returns double value equivalent of bi.
Returns float value equivalent of bi.
Returns int value equivalent of bi.
Returns long value equivalent of bi.
Returns decimal string representation of bi.
Returns string representation of bi in radix i.
Returns negative number if bi1<bi2, 0 if bi1==bi2, or positive number if bi1>bi2.

Есть ли метод, который вычисляет факториал в Java?

Класс Math и пакет java.math

Класс Math содержит методы, связанные с геометрией и тригонометрией и прочей математики. Методы реализованы как static, поэтому можно сразу вызывать через Math.methodName() без создания экземпляра класса.

В классе определены две константы типа double: E и PI.

Популярные методы для тригонометрических функций принимают параметр типа double, выражающий угол в радианах.

  • sin(double d)
  • cos(double d)
  • tan(double d)
  • asin(double d)
  • acos(double d)
  • atan(double d)
  • atan2(double y, double x)

Существуют также гиперболические функции: sinh(), cosh(), tanh().

Экспоненциальные функции: cbrt(), exp(), expm1(), log(), log10(), log1p(), pow(), scalb(), sqrt().

Из них хорошо знакомы возведение в степень — pow(2.0, 3.0) вернёт 8.0. И квадратный корень — sqrt(4.0).

Функции округления:

  • abs() — возвращает абсолютное значение аргумента
  • ceil() — возвращает наименьшее целое число, которое больше аргумента
  • floor() — возвращает наибольшее целое число, которое меньше или равно аргументу
  • max() — возвращает большее из двух чисел
  • min() — возвращает меньшее из двух чисел
  • nextAfter() — возвращает следующее значение после аргумента в заданном направлении
  • nextUp() — возвращает следующее значение в положительном направлении
  • rint() — возвращает ближайшее целое к аргументу
  • round() — возвращает аргумент, округлённый вверх до ближайшего числа
  • ulp() — возвращает дистанцию между значением и ближайшим большим значением

Другие методы

  • copySign() — возвращает аргумент с тем же знаком, что у второго аргумента
  • getExponent() — возвращает экспоненту
  • IEEEremainder() — возвращает остаток от деления
  • hypot() — возвращает длину гипотенузы
  • random() — возвращает случайное число между 0 и 1 (единица в диапазон не входит)
  • signum() — возвращает знак значения
  • toDegrees() — преобразует радианы в градусы
  • toRadians() — преобразует градусы в радианы

Большие числа

Если вам не хватает точности основных типов для представления целых и вещественных чисел, то можно использовать классы BigInteger и BigDecimal из пакета java.math, которые предназначены для выполнения действий с числами, состоящими из произвольного количества цифр.

Для преобразования обычного числа в число с произвольной точностью (называемое большим числом) вызывается статический метод valueOf():

При работе с большими числами нельзя использовать привычные математические операции с помощью + или * и т.п. Вместо них следует использовать специальные методы add() (сложение), multiply() (умножение), divide() (деление) и т.д.

В обычной практике эти числа используются редко.

Реклама

Статья проплачена кошками — всемирно известными производителями котят.

Если статья вам понравилась, то можете поддержать проект.

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*