Мне нужно найти факториал в java без использования цикла или рекурсии? Так что, если есть способ, пожалуйста, помогите. Спасибо
Как найти факториал без использования рекурсии или цикла в java?
Ответы (6)
Немного непрактично, но нигде нет явного цикла.
import javax.swing.Timer;
import java.awt.event.*;
import java.util.concurrent.ArrayBlockingQueue;
public class Fac {
public static int fac(final int _n) {
final ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(1);
final Timer timer = new Timer(0, null);
timer.addActionListener(new ActionListener() {
int result = 1;
int n = _n;
public void actionPerformed(ActionEvent e) {
result *= n;
n--;
if(n == 0) {
try {
queue.put(result);
} catch(Exception ex) {
}
timer.stop();
}
}
});
timer.start();
int result = 0;
try {
result = queue.take();
} catch(Exception ex) {
}
return result;
}
public static void main(String[] args) {
System.out.println(fac(10));
}
}
Используйте аппроксимацию Стирлинга для гамма-функции http://en.wikipedia.org/wiki/Stirling%27s_ приблизительно а>
Но это будет не точно.
Здесь есть еще один пост, на который вы, возможно, захотите взглянуть:
Есть ли метод, вычисляющий факториал в Java?< /а>
Кроме того, по этой ссылке есть множество различных реализаций факториальных функций - здесь вы можете найти то, что ищете. По крайней мере, вы узнаете тонны о факториалах.
http://www.luschny.de/math/factorial/FastFactorialFunctions.htm
Простое решение с одним вкладышем, хотя внутри оно выполняет цикл, так как без него это невозможно, но вам не нужно делать это самостоятельно:
Long factorialNumber = LongStream.rangeClosed(2, N).reduce(1, Math::multiplyExact);
Вы предварительно вычисляете значения.
А если серьезно, то на самом деле это невыполнимо, поскольку рекурсия и циклы неизбежны, если вам может потребоваться выполнить сколь угодно много вычислений.
Мы можем сделать функциональный факториал в Java 8:
package com.promindis.jdk8;
import java.math.BigInteger;
import static java.math.BigInteger.*;
public class Factorial implements TCO {
private TailCall<BigInteger> factorialTCO(
final BigInteger fact, final BigInteger remaining) {
if (remaining.equals(ONE))
return done(fact);
else
return call(() ->
factorialTCO(fact.multiply(remaining), dec(remaining)));
}
private BigInteger dec(final BigInteger remaining) {
return remaining.subtract(ONE);
}
private BigInteger apply(final String from) {
return factorialTCO(ONE, new BigInteger(from)).invoke();
}
public static void main(final String[] args) {
System.out.println(new Factorial().apply("5"));
System.out.println(new Factorial().apply("100"));
}
}