{with {fac {fun {n} {with {facX {fun {facY} {fun {n} {if0 n 1 {* n {{facY facY} {- n 1}}}}}}} {{facX facX} n}}}} {fac 5}}
{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}