2012-10-06 4 views
0

나는 스스로 자바를 배우고 있으며 나는 지금 메모 작성에 대해 배우고있다. 하지만 내 길을 잃는 일종의 ...자바에서 조합을 계산하는 방법은 무엇입니까? 메모를 사용하여?

재귀를 사용하고 메모를 사용하여 알고리즘을 가속화하여 Java에서 조합을 계산하는 방법에 대한 샘플 코드가 있습니까?

C5,3 = 5 * 4 * 3/3 * 2 * 1 = 10을 계산하는 방법과 같습니다. 재귀를 사용합니까?

+3

우편 번호는 시도 것을 보여주는, 어디 특별히 문제가 발생할 수 있습니다. 마찬가지로 질문은 너무 광범위합니다. –

+0

아마도 '이항 계수'를 더 잘 검색 할 수 있습니다. 여기 코드 http://penguin.ewu.edu/cscd320/Topic/Strategies/DynamicPgming/Binom_Memo.java – halex

답변

1

은 예와 함께 할 수 있습니다 (20)는 20 choose 5 이후 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)); 
    } 
+0

당신의 도움에 감사드립니다. 나는 그것을 이해할 수 있지만 나는 정말로 자바에 익숙하다. 난 실제로 코드를 실행할 수 없습니다 .... – jackhao

+0

그것은 코드를 실행하는 의미가 아니지만 예를 들어 – gtgaxiola

+0

@ jackha 나는 pastebin에 넣어 http://pastebin.com/TMavCnb4 – gtgaxiola

관련 문제