{"id":1042,"date":"2023-12-23T17:02:08","date_gmt":"2023-12-23T08:02:08","guid":{"rendered":"https:\/\/skanto.co.kr\/?p=1042"},"modified":"2023-12-23T17:18:16","modified_gmt":"2023-12-23T08:18:16","slug":"recursion-and-tail-call-optimization","status":"publish","type":"post","link":"https:\/\/skanto.co.kr\/?p=1042","title":{"rendered":"Recursion and Tail-Call Optimization"},"content":{"rendered":"\n<p>\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c Recursive Call\uc744 \uc124\uba85\ud560 \ub54c \ub2f9\uace8\ub85c \uc5b8\uae09\ub418\ub294 \uac83\uc774 factorial \uc608\uc81c\ub97c \ud1b5\ud574 \uac12\uc744 \uad6c\ud558\ub294 \uac83\uc77c \uac83\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int factorial(int n) {\n  if (n &lt;= 1) \/\/ Base case\n    return 1; \n  return n * factorial(n - 1); \/\/ Recursive case\n}<\/code><\/pre>\n\n\n\n<p>\uadf8\ub0e5 \uac89\uc73c\ub85c \ubcf4\uae30\uc5d0\ub294 \ucf54\ub4dc\uc758 \uae38\uc774\uac00 \uc9e7\uace0 \uae54\uae08\ud574 \ubcf4\uc774\uc9c0\ub9cc \ub0b4\ubd80\uc801\uc73c\ub85c \ubcf4\uba74 Stack\uc744 \uacfc\ub3c4\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\uace0 \uc774\ub85c \uc778\ud574 Stack Overflow\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \uc788\uc5b4 \ub418\ub3c4\ub85d\uc774\uba74 Recursion\ubcf4\ub2e4 Loop\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \uac00\uc774\ub4dc \ud558\uace0 \uc788\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tail Call\uc774\ub780<\/h2>\n\n\n\n<p>Java\ub294 \ub2e8\uc9c0 \uc5b8\uc5b4(language)\ub97c \ub118\uc5b4 \ud558\ub098\uc758 \ud50c\ub7ab\ud3fc \uc5ed\ud560\uc744 \ud55c\ub2e4. \uc989, JVM\uc740 \ub2e8\uc9c0 Java \uc5b8\uc5b4 \ubfd0\ub9cc \uc544\ub2c8\ub77c Groovy, Scala\uac19\uc774 \ub2e4\ub978 \uc5b8\uc5b4\ub4e4\ub3c4 \uc9c0\uc6d0\ud55c\ub2e4\ub294 \uac83\uc744 \uc54c\uace0\ub098\uba74 \ud50c\ub7ab\ud3fc\uc774\ub780 \ub9d0\uc774 \uc774\ud574\uac00 \ub420 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p>\ub9ce\uc740 functional language interpreter\ub4e4\uc740 recursion \ub3d9\uc791\uc744 optimize\ud568\uc73c\ub85c\uc368 tail call\uc5d0\uc11c \ubc1c\uc0dd\ud558\ub294 stack space\uc744 \ub9ce\uc774 \uc904\uc5ec \uc900\ub2e4. Tail Call\uc774\ub780 \uc5b4\ub5a4 method call \ub610\ub294 function call\uc774 \ub2e4\ub978 method \ub610\ub294 function \ub0b4\uc5d0\uc11c \uc2e4\ud589\ub420 \ub54c \uc81c\uc77c \ub9c8\uc9c0\ub9c9\uc5d0 \uc2e4\ud589\ub418\ub294 \uba85\ub839\uc5b4\uc77c \ub54c\ub97c \ub9d0\ud55c\ub2e4.  \uc544\ub798 \uc815\uc758\ub41c foo()\ub97c \ubcf4\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int foo(int a) {\n  a = a + 1;\n  return func(a);\n}<\/code><\/pre>\n\n\n\n<p>func() \ud638\ucd9c\uc740 foo() function\uc5d0\uc11c \uc81c\uc77c \ub9c8\uc9c0\ub9c9\uc5d0 \ud638\ucd9c\ub418\ub294 \uad6c\ubb38\uc774 \ub418\ubbc0\ub85c Tail Call\uc774 \ub41c\ub2e4. \ub2e4\uc74c\uc740 C\uc5b8\uc5b4\ub85c \uc791\uc131\ub41c Recursive function\uc5d0\uc11c Tail Call\uc774 \ub418\ub294 \ub2e4\ub978 \ud615\ud0dc\uc758 \uc608\uc81c\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int fact(int i, int acc) {\n  if ( i == 0 ) \n    return acc;\n  else\n    return fact( i \u2013 1, acc * i);\n}\n\nint factorial(int n) {\n  if ( n == 0 )\n    return 1;\n  else\n    return fact( n \u2013 1, 1 );\n}<\/code><\/pre>\n\n\n\n<p>\uc774 \ucf54\ub4dc\ub97c \ucef4\ud30c\uc77c\ud55c \ud6c4 \ub514\ubc84\uae45\uc744 \ud574\ubcf4\uba74 \uc544\ub798 \uadf8\ub9bc\uacfc \uac19\uc774 \uc2e4\ud589\ub418\ub294 \uc5b4\uc148\ube14\ub9ac \ucf54\ub4dc\ub97c \ubcfc \uc218 \uc788\ub2e4. \uc5ec\uae30\uc11c \ube68\uac04\uc0c9 \ud654\uc0b4\ud45c\ub294 fact() function\uc758 \ub9c8\uc9c0\ub9c9 \ub450 \ubb38\uc7a5\uc744 \uac00\ub9ac\ud0a8\ub2e4. fact() \uc7ac\uadc0 \ud638\ucd9c \ud568\uc218\uc640 return\ubb38\uc778 retq\uc774\uba70 \uc774 \ubd80\ubd84\uc774 tail call\uc5d0 \ud574\ub2f9\ud55c\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/blogs.oracle.com\/content\/published\/api\/v1.1\/assets\/CONT9EB0F331116749B68352D80442A81542\/Medium?cb=_cache_76fd&amp;format=jpg&amp;channelToken=4d6a6a00a153413e9a7a992032379dbf\" alt=\"\" style=\"width:633px;height:auto\"\/><figcaption class=\"wp-element-caption\">Function&nbsp;<code>fact()<\/code>\uc740 \uc5b4\uc148\ud50c\ub9ac \ucf54\ub4dc\uc5d0\uc11c \ubcf4\ub294 \uac83\ucc98\ub7fc recursive tail call\uc774\ub2e4.<\/figcaption><\/figure>\n\n\n\n<p>\uc790 \uadf8\ub7fc \uc774\ub4e4 function\uc744 optimize\ud558\uba74 \uc5b4\ub5a4 \uc7a5\uc810\ub4e4\uc774 \uc788\ub294\uc9c0 \uc54c\uc544\ubcf4\uc790.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tail-Call Optimization<\/h2>\n\n\n\n<p>Tail-Call Optimization(TCO)\ub294 recursive call\uacfc \uad00\ub828\uc774 \uae4a\uc73c\uba70 functional programming\uc5d0\uc11c\uc758 \uc911\uc694\ud55c \ud1a0\ud53d\uc911 \ud558\ub098\ub2e4. \uc7ac\uadc0\ud568\uc218\ub294 <em>goto<\/em>\ubb38\uc744 \ud65c\uc6a9\ud574\uc11c optimize\ud560 \uc218 \uc788\ub2e4. \uc774\ub7f0 <strong><span style=\"text-decoration: underline;\">optimization\uc744 \uc774\uc6a9\ud558\uba74 function call \uc774\uc804(<em>prolog<\/em>)\uacfc stack\uc5d0\uc11c \ubcf5\uc6d0\ub41c \uc774\ud6c4(<em>epilog<\/em>)\uc5d0\uc11c \ud588\ub358 \uc791\uc5c5\ub4e4\uc744 \ub354\uc774\uc0c1 \uc218\ud589\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.<\/span><\/strong><\/p>\n\n\n\n<p>\uc544\ub798\uc758 \ucf54\ub4dc\ub97c \uc0b4\ud3b4\ubcf4\uba74<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int func_a(int data) {\n  data = do_this(data);\n  return do_that(data);\n}<\/code><\/pre>\n\n\n\n<p>function do_that()\uc740 tail call\uc774 \ub418\uba70 optimize\ud558\uae30 \uc774\uc804\uc758 \uc5b4\uc148\ube14\ub9ac \ucf54\ub4dc\ub294 \uc544\ub798\uc640 \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>... ! executing inside func_a()\npush EIP ! push current instruction pointer on stack\npush data ! push variable 'data' on the stack\njmp do_this ! call do_this() by jumping to its address\n... ! executing inside do_this()\npush EIP ! push current instruction pointer on stack\npush data ! push variable 'data' on the stack\njmp do_that ! call do_that() by jumping to its address\n... ! executing inside do_that()\npop data ! prepare to return value of 'data'\npop EIP ! return to do_this()\npop data ! prepare to return value of 'data'\npop EIP ! return to func_a()\npop data ! prepare to return value of 'data'\npop EIP ! return to func_a() caller\n...<\/code><\/pre>\n\n\n\n<p>data\uc640 EIP(extended instruction pointer) \ub450 \ub808\uc9c0\uc2a4\ud130\uc5d0 \ub300\ud55c pop\uba85\ub839\uc5b4\uac00 \uc5f0\uc18d\ud574\uc11c \uc5ec\ub7ec \ubc88 \uc2e4\ud589\ub41c\ub2e4\ub294 \uac83\uc5d0 \uc8fc\ubaa9\ud560 \ud544\uc694\uac00 \uc788\ub2e4. EIP \ub808\uc9c0\uc2a4\ud130 data\uc758 \uac12\uc744 \ubc18\ud658\ud558\uace0 instruction pointer\ub97c \uc774\uc804 \uc0c1\ud0dc\ub85c \uc6d0\ubcf5\uc2dc\ud0a8\ub2e4. \uc5b4\uc148\ube14\ub9ac \uba85\ub839\uc5b4\uc778 jump(JUMP) \ud558\ub098\ub85c \uc774\ub4e4 epilog\uc640 prolog \ud55c \uc138\ud2b8\ub97c \uc0dd\ub7b5\ud560 \uc218 \uc788\ub2e4. \uc774\ub807\uac8c \ud558\uba74 function do_that()\uc774 function_a()\uc758 epilog \ucf54\ub4dc\ub97c \uc2e4\ud589\ud558\uae30 \ub54c\ubb38\uc5d0 \uc774 optimization\uc774 \uac00\ub2a5\ud574 \uc9c4\ub2e4.<\/p>\n\n\n\n<p>\ub610\ud55c function_a()\uac00 do_that()\uc758 \ub9ac\ud134\ubb38\uc774 \uc2e4\ud589\ub41c \uc774\ud6c4\uc5d0 \ub354\uc774\uc0c1 \uc544\ubb34\ub7f0 \uc758\ubbf8\uc788\ub294 \ub3d9\uc791\uc744 \ud558\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc774 optimization\uc740 \uc548\uc804\ud558\ub2e4\ub77c\uace0 \ubcfc \uc218 \uc788\ub2e4(tail call\uc774\uae30 \ub54c\ubb38). <\/p>\n\n\n\n<p>\ub2e4\uc74c\uc740 TCO\uc758 \uacb0\uacfc\ub97c \ubcf4\uc5ec\uc900\ub2e4. strike\uc904\uc744 \uce5c \uad6c\ubb38\uc740 \ub354\uc774\uc0c1 \uc2e4\ud589\ud560 \ud544\uc694\uac00 \uc5c6\ub294 \uba85\ub839\uc5b4\ub97c \ub098\ud0c0\ub0b8\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blogs.oracle.com\/content\/published\/api\/v1.1\/assets\/CONT83D92251D48846E0B0285618A0AED5E5\/Medium?cb=_cache_76fd&amp;format=jpg&amp;channelToken=4d6a6a00a153413e9a7a992032379dbf\" alt=\"\"\/><\/figure>\n\n\n\n<p>\uc880 \ub2e4\ub974\uac8c \ud45c\ud604\ud574\uc11c \uc544\ub798\uc758 \ucf54\ub4dc\uac00 TCO\uc774\uc804\uc758 \ucf54\ub4dc\uc774\uba70<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blogs.oracle.com\/content\/published\/api\/v1.1\/assets\/CONT98B58EA1D682433D86E8B272EFE48B9F\/Medium?cb=_cache_76fd&amp;format=jpg&amp;channelToken=4d6a6a00a153413e9a7a992032379dbf\" alt=\"\"\/><\/figure>\n\n\n\n<p>\uc544\ub798\ub294 TCO \uc774\ud6c4\uc758 \ucf54\ub4dc\uc774\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/blogs.oracle.com\/content\/published\/api\/v1.1\/assets\/CONT328C0EE64B5540018BFE87DF3D2B65E3\/Medium?cb=_cache_76fd&amp;format=jpg&amp;channelToken=4d6a6a00a153413e9a7a992032379dbf\" alt=\"\"\/><\/figure>\n\n\n\n<p>\uc74c\uc601\uc73c\ub85c \ucc98\ub9ac\ub41c \ucf54\ub4dc\ub97c \ube44\uad50\ud574 \ubcf4\uba74 optimize\ub41c \ubc84\uc804\uc5d0\uc11c \uc5bc\ub9c8\ub098 \ub9ce\uc740 machine code\uac00 \uc904\uc5b4 \ub4e4\uc5c8\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p>\ucf54\ub4dc\uc758 \uc591\uc744 \uc904\uc774\ub294 \uac83\uc740 \uc88b\uae34 \ud558\uc9c0\ub9cc \uc774\uac83\uc774 optimize\ub41c \ubc84\uc804\uc744 \uc120\ud638\ud558\ub294 \uac00\uc7a5 \ud070 \uc774\uc720\ub294 \uc544\ub2c8\ub2e4. \uc2e4\uc9c8\uc801\uc778 \uc7a5\uc810\uc740 TCO\ub97c Recursion\uacfc \ube44\uad50\ud560 \ub54c \ube44\ub85c\uc18c \ub4dc\ub7ec\ub09c\ub2e4.<\/p>\n\n\n\n<p>\uc55e\uc5d0\uc11c \ubcf8 recursive factorial \uc608\uc81c\uc5d0 \uc774 optimization\uc744 \uc801\uc6a9\ud574\ubcf4\uba74 \ubc18\ubcf5\ud574\uc11c \ud544\uc694\ub85c \ud588\ub358 <em>prolog<\/em>\uc640 <em>epilog<\/em> \uc5b4\uc148\ud50c\ub9ac \ucf54\ub4dc\uac00 \ubaa8\ub450 \uc0ac\ub77c\uc9c4 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. \uc774\ub7f0 optimization\uc744 \uc801\uc6a9\ud558\uba74 \uc544\ub798\uc758 recursive pseudocode\ub97c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>call factorial(3)\n  call fact(3,1)\n    call fact(2,3)\n      call fact(1,6)\n        call fact(0,6)\n        return 6\n      return 6\n    return 6\n  return 6\nreturn 6<\/code><\/pre>\n\n\n\n<p>iterative(\uc21c\ucc28\uc801\uc778) pseudocode\ub85c \ubc14\uafd4\uc900\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>call factorial(3)\n  call fact(3,1)\n  update variables with (2,3)\n  update variables with (1,6)\n  update variables with (0,6)\n  return 6\nreturn 6<\/code><\/pre>\n\n\n\n<p>\ub2ec\ub9ac \ub9d0\ud558\uba74 TCO\ub294 recursive code\ub97c loop code\ub85c \ub300\uccb4\uc2dc\ucf1c \uc900\ub2e4. \uc774 optimization\uc740 \uacc4\uc18d\ub418\ub294 recursive call\ub3d9\uc548 prolog\uc640 epilog \uc5b4\uc148\ud50c\ub9ac \ucf54\ub4dc\uc5d0 \ub300\ud55c function call\uc744 \uc904\uc5ec\uc8fc\uba70 \uc774\ub85c \uc778\ud574 stack\uc0ac\uc6a9 \ub610\ud55c \uacbd\uac10\uc2dc\ucf1c \uc900\ub2e4.<\/p>\n\n\n\n<p>\uc774\ub7f0 optimization\uc774 \uc5c6\uc774 \uc544\uc8fc \ud070 \uc218\uc758 factorial\uc744 \uc5f0\uc0b0\ud558\uba74 Stack Overflow\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc9c0\ub9cc Compile\uacfc\uc815\uc5d0\uc11c loop\ubb38\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ubcc0\ud658\uc2dc\ucf1c \uc900\ub2e4\uba74 \uc774\ub7f0 \uc704\ud5d8\uc131\uc744 \uc81c\uac70\ud560 \uc218 \uc788\ub2e4. \uc774\uac83\uc774 \ub300\ubd80\ubd84\uc758 functional programming language interpreter\uac00 \uc774\uba74\uc5d0\uc11c TCO\ub97c \uc218\ud589\ud558\ub294 \uc774\uc720\uc774\uae30\ub3c4 \ud558\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Java\uc640 TCO<\/h2>\n\n\n\n<p>2014\ub144\ubd80\ud130 Java Language Architect\uadf8\ub8f9 \ub0b4\uc5d0\uc11c\ub294 TCO\uc5d0 \ub300\ud574 \ub17c\uc758\ub97c \ud574\uc624\uace0 \uc788\uc9c0\ub9cc \uc544\uc9c1 JVM\uc5d0 \ubc18\uc601\ub418\uc9c0 \uc54a\uace0 \uc788\ub2e4. \ud5a5\ud6c4 \uc5b8\uc820\uac00 \ubc18\uc601\uc740 \ub418\uaca0\uc9c0\ub9cc \uc544\ub798\uc640 \uac19\uc740 security\uc774\uc288\ub85c TCO\uac00 \uc644\ubcbd\ud558\uac8c \uad6c\ud604\ub418\uc9c0 \uc54a\uc740 \uc0c1\ud0dc\ub77c\uace0 \ud55c\ub2e4.<\/p>\n\n\n\n<p>Oracle Java Platform Group\uc758 Mark Reinhold chief architect\ub294 \ud55c <a href=\"https:\/\/blogs.oracle.com\/javamagazine\/post\/what-are-they-buildingand-why-6-questions-for-the-top-java-architects\">\ube14\ub85c\uadf8<\/a>\uc5d0\uc11c \uc544\ub798\uc640 \uac19\uc774 \uc5b8\uae09\ud588\ub2e4.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>It\u2019s not clear to me that we would ever want to expose tail calls and continuations in the platform for general use but there may be ways we could use them inside the platform, in some fairly interesting ways.<\/p>\n<\/blockquote>\n\n\n\n<p>Java\uc5b8\uc5b4\ub97c \uc0ac\uc6a9\ud558\ub294 \uac1c\ubc1c\uc790\ub4e4\uc5d0\uac8c\ub294 JVM\uc5d0 TCO\ub97c \uc9c0\uc6d0\ud558\uc9c0 \uc54a\ub294\ub2e4\ub294 \uac83\uc774 \uc5ec\uc804\ud788 \uc544\uc26c\uc6b4 \ubd80\ubd84\uc774\uc9c0\ub9cc \uc544\ub798\uc640 \uac19\uc774 Recursive\ucf54\ub4dc\ub97c loop\ubb38\uc744 \uc774\uc6a9\ud558\uc5ec \ud68c\ud53c\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int factorial(int n) {\n  int result = 1;\n  for (int t=n; t &gt; 1; t--)\n      result *= t;\n  return result;\n}<\/code><\/pre>\n\n\n\n<p>\ud558\uc9c0\ub9cc JVM \uae30\ubc18\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 \ub2e4\ub978 functional language(Groovy, Scala)\ub97c \uc0ac\uc6a9\ud560 \ub54c\ub294 \uc774\uc288\uac00 \ub41c\ub2e4. \uc774 \uacbd\uc6b0 \uc5b8\uc5b4 \uc790\uccb4\uc801\uc73c\ub85c TCO\ub97c \uc801\uc6a9\ud558\uc5ec recursive\uac00 \uc798 \ub3d9\uc791\ud588\uc9c0\ub9cc Java \uc5b8\uc5b4\uc5d0 \ub3d9\uc77c\ud558\uac8c \uc801\uc6a9\ud55c\ub2e4\uba74 Stack Overflow\ub97c \ub9c8\uc8fc\ud558\uac8c \ub420 \uac83\uc774\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud504\ub85c\uadf8\ub798\ubc0d\uc5d0\uc11c Recursive Call\uc744 \uc124\uba85\ud560 \ub54c \ub2f9\uace8\ub85c \uc5b8\uae09\ub418\ub294 \uac83\uc774 factorial \uc608\uc81c\ub97c \ud1b5\ud574 \uac12\uc744 \uad6c\ud558\ub294 \uac83\uc77c \uac83\uc774\ub2e4. \uadf8\ub0e5 \uac89\uc73c\ub85c \ubcf4\uae30\uc5d0\ub294 \ucf54\ub4dc\uc758 \uae38\uc774\uac00 \uc9e7\uace0 \uae54\uae08\ud574 \ubcf4\uc774\uc9c0\ub9cc \ub0b4\ubd80\uc801\uc73c\ub85c \ubcf4\uba74 Stack\uc744 \uacfc\ub3c4\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\uace0 \uc774\ub85c \uc778\ud574 Stack Overflow\uac00 \ubc1c\uc0dd\ud560 \uac00\ub2a5\uc131\uc774 \uc788\uc5b4 \ub418\ub3c4\ub85d\uc774\uba74 Recursion\ubcf4\ub2e4 Loop\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \uac00\uc774\ub4dc \ud558\uace0 \uc788\ub2e4. Tail Call\uc774\ub780 Java\ub294 \ub2e8\uc9c0 \uc5b8\uc5b4(language)\ub97c \ub118\uc5b4 \ud558\ub098\uc758 \ud50c\ub7ab\ud3fc \uc5ed\ud560\uc744 \ud55c\ub2e4. \uc989, JVM\uc740 \ub2e8\uc9c0 Java \uc5b8\uc5b4 \ubfd0\ub9cc \uc544\ub2c8\ub77c Groovy, Scala\uac19\uc774 \ub2e4\ub978 \uc5b8\uc5b4\ub4e4\ub3c4 \uc9c0\uc6d0\ud55c\ub2e4\ub294 \uac83\uc744 \uc54c\uace0\ub098\uba74 \ud50c\ub7ab\ud3fc\uc774\ub780 \ub9d0\uc774 \uc774\ud574\uac00 \ub420 \uac83\uc774\ub2e4. \ub9ce\uc740 functional language interpreter\ub4e4\uc740 recursion \ub3d9\uc791\uc744 optimize\ud568\uc73c\ub85c\uc368&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/skanto.co.kr\/?p=1042\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[14],"tags":[98,97,99],"class_list":["post-1042","post","type-post","status-publish","format-standard","hentry","category-sw-development","tag-recursion","tag-tail-call-optimization","tag-tco"],"_links":{"self":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/1042","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1042"}],"version-history":[{"count":17,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/1042\/revisions"}],"predecessor-version":[{"id":1059,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/1042\/revisions\/1059"}],"wp:attachment":[{"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1042"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/skanto.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}