-
{with {fac {fun {n} {with {facX {fun {facY} {fun {n} {if0 n 1 {* n {{facY facY} {- n 1}}}}}}} {{facX facX} n}}}} {fac 5}}컴공지식/프로그래밍언어론 2024. 11. 7. 01:24
{with {fac {fun {n} {with {facX {fun {facY} {fun {n} {if0 n 1 {* n {{facY facY} {- n 1}}}}}}} {{facX facX} n}}}} {fac 10}}
도저히 맨정신으로는 이걸 이해할 수 없어서 따로 글을 적으며 이해해보려고 한다.
{with {fac {fun {n} {with {facX {fun {facY} {fun {n} {if0 n 1 {* n {{facY facY} {- n 1}}}}}}} {{facX facX} n}}}} {fac 5}}
최상위 with 구문
with {fac
{fun {n}
{with {facX
{fun {facY}
{fun {n}
{if0 n
1
{* n {{facY facY} {- n 1}}}}}}}
{{facX facX} n}}}}최상위 fac 함수 정의
{fun {n}
{with {facX
{fun {facY}
{fun {n}
{if0 n
1
{* n {{facY facY} {- n 1}}}}}}}
{{facX facX} n}}}fac 함수는 입력값 n을 받아 내부에서 facX라는 함수를 정의한다.
이 facX 함수는 자기 자신을 인자로 받아 재귀적으로 호출될 수 있는 함수를 생성하기 위한 것이다.
내부 with 구문 - facX 정의
with {facX
{fun {facY}
{fun {n}
{if0 n
1
{* n {{facY facY} {- n 1}}}}}}}facX는 facY라는 인자를 받는 함수다.
이 facX는 실제 팩토리얼 계산을 수행하는 함수이며, 재귀적으로 자기 자신을 호출하는 구조로 되어 있다.
facX의 내부 함수
{fun {n}
{if0 n
1
{* n {{facY facY} {- n 1}}}}if0 n 1은 n이 0이면 1을 반환하고, 그렇지 않으면 n * (facY (n-1))을 계산하여 재귀적으로 팩토리얼을 구한다.
이때 facY가 재귀적으로 자기 자신을 호출하도록 구성되어 있어, 결과적으로 팩토리얼 계산이 이루어진다.
최종 호출 부분
{{facX facX} n}
facX를 facX에 전달하여 재귀 호출을 가능하게 한다.
그런 다음, 입력 n을 전달하여 팩토리얼 계산이 시작된다.
예시
1. {fac 5} 호출
2. {{facX facX} 5}로 진입
3. 첫 번째 재귀 호출 {facY facY}
'컴공지식 > 프로그래밍언어론' 카테고리의 다른 글
vs문 이해 예시 (2) 2024.11.10 vs가 중요하다 (2) 2024.11.08 JVM은 일종의 인터프리터 (0) 2024.11.03 Box 데이터 구조 (2) 2024.11.02 재귀로 인해 추가된 코드 부분 (1) 2024.10.27