2

ループや再帰を使用せずにJavaで階乗を見つける必要がありますか? それで何か方法があれば助けてください。ありがとう

4

6 に答える 6

7

ガンマ関数にスターリング近似を使用http://en.wikipedia.org/wiki/Stirling%27s_approximation

ここに画像の説明を入力

しかし、それは正確ではありません。

于 2012-11-17T19:02:55.440 に答える
2

ここに別の投稿があります。こちらをご覧ください。

Javaで階乗を計算する方法はありますか?

また、このリンクには階乗関数のさまざまな実装が多数あります。ここで探しているものが見つかるかもしれません。少なくとも、階乗についてたくさん学ぶことができます。

http://www.luschny.de/math/factorial/FastFactorialFunctions.htm

于 2012-11-17T19:06:28.070 に答える
1

少し非現実的ですが、明示的なループはどこにもありません。

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));
    }
}
于 2012-11-17T19:54:41.400 に答える
0

値を事前に計算します。

もっと深刻なことに、それは本当に実行可能ではありません。なぜなら、任意に多くの計算を行う必要がある場合、再帰とループは避けられないからです。

于 2012-11-17T18:56:03.420 に答える
-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"));

  }
}

ソース

于 2013-08-23T15:43:59.053 に答える