【问题标题】:How to compute combination in java? by using memoization? [closed]如何在java中计算组合?通过使用记忆? [关闭]
【发布时间】:2012-10-06 21:46:55
【问题描述】:

我自己正在学习 JAVA,我现在正在学习记忆。但我有点迷失方向......

有没有人有一些关于如何在 Java 中通过使用递归和使用记忆来加速算法来计算组合的示例代码?

像计算 C5,3 = 5*4*3/3*2*1 = 10 的方法一样?但是使用递归?

【问题讨论】:

标签: java recursion memoization


【解决方案1】:

举个例子20选5

由于20 choose 5被定义为20! / ( 5! * (20-5)! )

我们可以使用memoization 来存储这些阶乘计算,这样我们就不必在递归下不断地重新计算它们。

所以:

    //STORING FACTORIAL COMPUTATIONS
    private Map<Integer,Long> factorialMap = new HashMap<Integer,Long>();


    public Long getFactorial(int number) {

        //CHECK IF I ALREADY COMPUTED THIS FACTORIAL
        Long val = factorialMap.get(number);
        if(val != null) {
            //GOT IT!
            return val;
        } else {
            //NEED TO COMPUTE!
            val = getFactorialRecursive(number);
            //STORING IT TO SAVE COMPUTATION FOR LATER
            factorialMap.put(number, val);
            return val;
        }
    }

    //RECURSIVE FUNCTION TO COMPUTE FACTORIAL
    public Long getFactorialRecursive(int number) {
        if(number < 2) {
            return 1L;
        } else {
            return number * getFactorialRecursive(number-1);
        }
    }


    //ACTUAL CALL TO "20 choose 5"
    public Long combination(int fromVal, int chooseVal) {
        return getFactorial(fromVal)/(getFactorial(chooseVal)*getFactorial(fromVal-chooseVal));
    }

【讨论】:

  • 感谢您的帮助..我可以理解,但我对 java 真的很陌生。我实际上无法运行您的代码....
  • 这不是运行代码,而是作为示例
  • @jackhao 我把它放在 pastebin pastebin.com/TMavCnb4
  • 谢谢。你们真好。非常感谢。
【解决方案2】:

您可以在这里免费使用combinatoricslib 库:

http://code.google.com/p/combinatoricslib/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2018-04-19
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多