컴공지식/프로그래밍언어론

{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}