2. 지난 시간 숙제
recursion 과 stack overflow
• Iteration vs recursion
• Fibonacci f(n) = f(n-1) + f(n-2)
• Recursion 으로 푸는 편이 자연스럽다. 하지만…
• 자라나는 stack 의 속도 : 2n
• Stack overflow 발생
• Tail call recursion?
• Function 자신을 return하면 stack이 linear 하게 자라남
• Compiler가 지원해주면 stack이 자라나지 않을수도(!) 있음
• Tail call optimization 이라고 한다.
3. 지난 시간 숙제
recursion 과 stack overflow
• Trampoline
• Coding 은 recursion 으로
• 수행은 iteration 처럼
• 값이 evaluation 될 때 까지 call
stack 이 자라나지 않음
4. 지난 시간 숙제
recursion 과 stack overflow
• Java 의 tail call optimization 지원 계획은?
• https://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
• http://openjdk.java.net/projects/mlvm/subprojects.html#TailCall
• 딱히 지원해 줄 것 같지는 않아 보인다.
• 다른 언어는?
• golang, scala, ECMA6 … : 지원 또는 부분 지원
• 그밖에 다른 언어는 직접 알아보도록
5. Divide and conquer
• 큰 문제를 작은 문제로 나눈다.
• 작은 문제를 해결한다.
• 병합한다.
출처 : http://kugistory.net/76
6. 카라츠바 알고리즘
• 매우 큰 수에 대한 곱셈 연산
• 매우 큰 수를 다음과 같이 int[] 로 저장해보자
• 100000 : {0,0,0,0,0,1}
• O(𝑛2
) 방법
• 일반적으로 노트에 적어가며 푸는 방식과 동일
• 카라츠바 알고리즘
• 이항연산의 규칙을 이용하여 연산의 횟수를 줄임
• 큰 곱셈 문제를 작은 곱셈 여러 번으로 나누어 이 규칙을 적용
1234
x 5678
9872
8638
….