Abstraction 추상화
Primitive Expressions (원시 표현식) 은 가장 단순한 기본 개체이다. 원시 표현식을 결합하여 더 복잡한 구성으로 만든 것이 Means of Combination 이다.
Abstraction 추상화는 컴퓨터 언어에 있어서 매우 중요하다. 복잡한 내용들을 다시 기술하는건 비효율적이기에, 이걸 추상화 시켜서 하나의 이름으로 만든다. 함수도 추상화 방법 중 하나이다.
즉, 복잡하게 조합된 표현식 전체에 이름을 붙이고 모듈로 만드는 것이 Abstraction 추상화이다.
함수 추상화
함수를 해석하는 방법에 따라 결과가 달라지기도 한다. Program Language 마다 함수 실행 방식이 다르다.
Applicative order 적용적 순서
함수를 적용하기 전에 전달된 인자의 값을 먼저 계산한다.
f(5)
➡️ sum_of_squres(5+1, 5 * 2)
➡️ square(6) + square(10)
➡️ (6 * 6) + (10 * 10)
➡️ 36 + 100
➡️ 136
Normal order 정상 순서
인자를 먼저 평가하지 않고, 표현식 그대로 함수 내부로 전달한다. 값이 실제로 필요해질 때 계산한다.
f(5)
➡️ sum_of_squres(5 + 1, 5 * 2)
➡️ square(5 + 1) + square(5 * 2)
➡️ ((5 + 1) * (5 + 1)) + ((5 * 2) * (5 * 2))
➡️ 6 * 6 + 10 * 10
➡️ 136
Recursion Version
어떤 함수가 자기 자신을 계속 부르는 것을 Recursion 함수라고 한다.
def sum(n):
if n == 0:
return 0
else:
return n + sum(n -1)
Tail Recursion 꼬리 재귀
Tail Recursion 은 재귀 호출이 함수의 마지막 연산으로 수행되는 방식이다. 재귀 호출 이후에 처리해야할 추가 연산이 없어, 결과값을 그대로 전달하기만 한다.
for 문과 비슷한 구조이고, 성능 면에서 일반 재귀보다 개선된다.
def sum_iter(n, total):
if n == 0:
return total
else:
return sum_iter(n-1, total+n)
def sum(n):
return sum_iter(n,0)
Fast exponentiation 빠른 거듭제곱
Exponentation 거듭 제곱 또한 재귀를 통해 구현할 수 있다. 더 개선된 Fast Exponentation 은 지수를 절반으로 쪼개는 분할 정복을 사용한다. 지수 n 이 짝수일 때 쪼갤수 있다.
Tree Recursion
피보나치 수열은 많이 사용된다. 피보나치 수열은 0은 0, 1은 1로 반환하고 나머지는 바로 두 항의 합으로 이루어지는 수열이다.
def fib(n):
if n == 0:
return 0
elif n ==1:
return 1
else:
return fib(n-1) + fib(n-2)
Recursion 을 정의하기 위해 쓰는 Recursion 함수가 많아서 복잡하다.
재귀는 큰 문제를 작은 문제로 나누고, 그 작은 문제가 자기 자신과 구조가 동일할 때 적용할 수 있는 해결 방법이다. 재귀 함수를 쓸 때는 termination 조건을 명시하는 것이 중요하다.
줄인 코드보다는 소스를 봤을 때 남들이 얼마나 잘 이해할 수 있는지가 중요함을 잊지말자.