Как найти факториал без использования рекурсии или цикла в java?

Мне нужно найти факториал в java без использования цикла или рекурсии? Так что, если есть способ, пожалуйста, помогите. Спасибо


person user1829457    schedule 17.11.2012    source источник
comment
Вы не можете вычислить факториал без цикла и рекурсии.   -  person Denys Séguret    schedule 17.11.2012
comment
вы можете использовать en.wikipedia.org/wiki/Stirling%27s_ приблизительно.   -  person twain249    schedule 17.11.2012
comment
Вы всегда можете разобрать эту страницу ;-)   -  person Tomasz Nurkiewicz    schedule 17.11.2012


Ответы (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));
    }
}
person SpiderPig    schedule 17.11.2012



Простое решение с одним вкладышем, хотя внутри оно выполняет цикл, так как без него это невозможно, но вам не нужно делать это самостоятельно:

Long factorialNumber = LongStream.rangeClosed(2, N).reduce(1, Math::multiplyExact);
person krmanish007    schedule 28.01.2016

Вы предварительно вычисляете значения.

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

person Louis Wasserman    schedule 17.11.2012

Мы можем сделать функциональный факториал в 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"));

  }
}

источник

person Graham Griffiths    schedule 23.08.2013
comment
хотя TBH и это, и решения SpiderPig просто играют с семантикой ... это рекурсия, но не ваша обычная рекурсия типа «вызов функции». - person Graham Griffiths; 23.08.2013