수학 함수와 일반적인 프로그래밍 언어 함수가 제공하는 함수의 차이점을 알아본다. 가장 중요한 차이점은 수정 가능한 변수의 개념에서 찾을 수 있다.
수학 함수의 매개 변수는 함수 적용 시에 그 값이 고정된다. 반면에 프로그래밍 언어 함수의 매개 변수는 기억 장치 셀의 이름이다. 함수는 그 이름을 써서 셀의 내용을 바꾸기도 한다. 또, 함수의 호출부와 공통으로 알고 있는 셀을 바꿈으로써 상호 작용이 일어난다. 이러한 부작용 때문에 프로그래밍 함수는 수학 함수와 달리 계층적으로 결합될 수 없는 경우가 많다.
또 다른 중요한 차이는 함수가 적용되는 방식이다. 프로그래밍 언어에서는 함수가 처리 순서에 따라 정의된다. 즉, 정의역의 값을 치역으로 사상시키는 규칙을 제어 구조에 맞게 순차 단계로 기술한다. 반면에 수학 함수는 함수적으로 정의된다. 즉, 사상 규칙을 다른 함수의 적용으로 정의한다. 수학 함수는 이런 의미에서 보다 더 계층적이다.
다수의 수학 함수가 재귀적(recursive)으로 정의된다. 즉, 함수의 정의 내에 바로 긓 마수의 적용이 나타난다. 예를 들어, 계승(factorial)의 수학적 정의는 아래와 같다.
n! ≡ if n = 0 then 1 else n * (n-1)!
피보나치 수열은
F(n) ≡ if n = 0 or n =1 then 1
else F(n - 1) + F(n - 2)
로 정의된다.
또 다른 예로써 앞의 소수 문제도 재귀적으로 정의할 수 있다. 아래의 술어 함수가 바로 소수인지를 판별하는 함수이다.
prime(n) ≡ if n =2 then true
else p(n, n div 2)
p(n, d) ≡ if (n mod i) = 0 tjen false
else if i = 2 then true
else p(n, i - 1)
되부름은 강한 문제 풀이의 기법으로서 함수 개념을 이용하여 프로그램을 작성할 때 자주 사용된다. 그러나 되부름이 모든 언어에서 허용되는 것이 아니기 때문에 되부름이 금지된 경우에는 함수를 구현하기가 복잡하고 부자연스럽게 된다.
댓글