有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (6) 个答案

  1. # 1 楼答案

    我们可以在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"));
    
      }
    }
    

    source

  2. # 2 楼答案

    简单的一行程序解决方案,虽然在内部它是在做一个循环,因为没有它是不可能的,但你不需要自己做:

    Long factorialNumber = LongStream.rangeClosed(2, N).reduce(1, Math::multiplyExact);
    
  3. # 4 楼答案

    有点不切实际,但任何地方都没有显式循环

    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));
        }
    }
    
  4. # 6 楼答案

    你可以预先计算这些值

    更严重的是,这实际上是不可行的,因为如果你可能需要做任意多的计算,递归和循环是不可避免的