KTUGFaq

KTUG FAQ

"Tail recursion"¿¡ ´ñ±Û ´õÇϱâ

·Î±×ÀÎ:
ºñ¹Ð¹øÈ£:
°¡ÀÔ
You will attract cultured and artistic people to your home.
FrontPage › LittleTree/ReadingTeXbook/2006-03
Mar 29, 2006
Tail recursion
Submitted by ÀÛÀº³ª¹« @ 03-29 [12:14 pm]
219ÂÊ: ´ÙÀ½°ú °°Àº ¸ÅÅ©·Î Á¤ÀÇ°¡ ÀÖ´Ù°í ÇսôÙ.
\def\foo{¾î¼±¸ Àú¼±¸ ... \bar ... Àú¼±¸ ¾î¼±¸}
Áï ¸ÅÅ©·Î \fooÀÇ replacement text ¾È¿¡ ´Ù¸¥ ¸ÅÅ©·Î \bar°¡ ÀÖ´Â °æ¿ìÀÔ´Ï´Ù. ÀÌ °æ¿ì, ¾Æ¸¶µµ TeXÀº \foo ¸ÅÅ©·Î¸¦ Àü°³ÇÏ´Ù°¡ \bar ¸ÅÅ©·Î¸¦ ¸¸³ª´Â ¼ø°£ \bar ¸ÅÅ©·ÎÀÇ Àü°³¸¦ ¸¶Ä£ ´ÙÀ½, ³²¾Æ ÀÖ´Â \foo ¸ÅÅ©·Î¸¦ °è¼Ó Àü°³Çϱâ À§Çؼ­ \foo ¸ÅÅ©·ÎÀÇ replacement text ³»ÀÇ \bar ¸ÅÅ©·Î ´ÙÀ½ÀÇ ÅäÅ« À§Ä¡¸¦ ±â¾ïÇØ µÎ¾î¾ß ÇÒ °ÍÀÔ´Ï´Ù. ¸¸¾à¿¡ \bar ¸ÅÅ©·Î ¿ª½Ã ±×ÀÇ replacement text ¾È¿¡ ´Ù¸¥ ¸ÅÅ©·Î°¡ ÀÖ´Ù¸é, \foo ¿Í ¸¶Âù°¡Áö·Î ¸Þ¸ð¸®ÀÇ ¾îµò°¡¿¡ °è¼Ó Àü°³ÇÒ ÅäÅ«ÀÇ À§Ä¡¸¦ Àû¾îµÎ¾î¾ß ÇÒ °ÍÀÔ´Ï´Ù.

±×·±µ¥, ¹®Á¦´Â À§ÀÇ ¿¹¿¡¼­ \bar°¡ \fooÀÎ °æ¿ìÀÔ´Ï´Ù. Áï, ¾Æ·¡¿Í °°Àº °æ¿ìÀε¥,
\def\foo{¾î¼±¸ Àú¼±¸ ... \foo ... Àú¼±¸ ¾î¼±¸}
ÀÌ·¯ÇÑ °æ¿ì¸¦ recursion À̶ó°í ÇÕ´Ï´Ù. ¿ì¸®¸»·Î 'Àç±Í'¶ó°í ÇÕ´Ï´Ù. °£´ÜÈ÷ ¸»Çؼ­ ¾î¶² °ÍÀ» Á¤ÀÇÇϴµ¥, ±× Á¤ÀÇ¿¡ ¾î¶² °Í Áï ÀÚ±â ÀÚ½ÅÀÌ ÀÌ¿ëµÈ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î GNU ¸ðµÎ ¾Æ½ÃÁÒ? ÀÌ GNUÀÇ Á¤ÀÇ°¡ GNU is Not UnixÀÇ ¾àÀÚ¶ó°í ÇÕ´Ï´Ù. GNU¸¦ Á¤ÀÇÇϴµ¥ GNU°¡ »ç¿ëµÇ¾ú±â ¶§¹®¿¡ ÀÌ ¿ª½Ã recursion À̶ó°í ÇÒ ¼ö ÀÖ½À´Ï´Ù. (¿ÂÅë Àç±Í·Î ÀÌ·ç¾îÁø, Àç±Í°¡ »ý¸íÀÎ ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹Ö ¾ð¾î Lisp°ú ±× lispÀ¸·Î ¸ðµç °ÍÀ» ´Ù ÇÒ ¼ö ÀÖ´Â emacs, ±×¸®°í ÀÌ emacs¸¦ ¸¸µç ½ºÅ縸, ½ºÅ縸ÀÌ ±íÀÌ °ü¿©ÇÏ°í ÀÖ´Â GNU. ÀÌ ¸ðµÎ°¡ GNUÀÇ Àç±ÍÀû Á¤ÀǸ¦ °®°Ô µÈ °Í°ú ¹«°üÇÏÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. :) Á¦ ÃßÃøÀÔ´Ï´Ù.)

À§ÀÇ \foo¿Í °°Àº ¸ÅÅ©·Î¸¦ Àü°³ÇÒ¶§ ¸¶´Ù, TeXÀº replacement text ³»ÀÇ \foo ´ÙÀ½ÀÇ ÅäÅ« À§Ä¡¸¦ ±â¾ïÇϱ⠸޸𸮸¦ °è¼Ó »ç¿ëÇÒ °ÍÀÔ´Ï´Ù. ¾Æ¸¶µµ ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹Ö¿¡¼­ ÀÚÁÖ »ç¿ëµÇ´Â ½ºÅÃÀ̶ó´Â °ÍÀ» ÀÌ¿ëÇÒ °Í°°Àºµ¥, \foo°¡ Àü°³µÉ¶§¸¶´Ù ½ºÅÿ¡´Â \fooÀÇ ´ÙÀ½ ÅäÅ« À§Ä¡¸¦ ±â¾ïÇϱâ À§Çؼ­ ±× ¸Þ¸ð¸® ¹øÁö°¡ ¸¹ÀÌ ½×ÀÏ °ÍÀÔ´Ï´Ù. ½ºÅÃÀÇ Àǹ̸¦ ¸ô¶óµµ ±×Àú ÄÄÇ»ÅÍÀÇ ¸Þ¸ð¸®¸¦ ¸¹ÀÌ »ç¿ëÇÑ´Ù°í ÀÌÇØÇÏ¸é µÉ °ÍÀÔ´Ï´Ù. ÄÄÇ»ÅÍÀÇ ¸Þ¸ð¸® ¶ÇÇÑ ÄÄÇ»ÅÍÀÇ ÀÚ¿øÀÌ°í, ÄÄÇ»ÅÍ°¡ ÀÚ¿øÀ» ¸¹ÀÌ »ç¿ëÇÑ´Ù´Â Àǹ̴ ½Ã°£°ú ÀÚ¿ø Ãø¸é¿¡¼­ ±×¸® È¿À²ÀûÀÌÁö ¸øÇÕ´Ï´Ù.

ÇÏÁö¸¸, °°Àº recursive ¸ÅÅ©·Î¶óµµ ´ÙÀ½°ú °°Àº °æ¿ì´Â ¾î¶³±î¿ä?
\def\foo{¾î¼±¸ Àú¼±¸ ... \foo}
À§ÀÇ Àç±Í¿Í ´Ù¸¥ Á¡Àº replacement text³»ÀÇ \foo ´ÙÀ½¿¡ ¾Æ¹«·± ÅäÅ«µµ ¾ø´Ù´Â Á¡ÀÔ´Ï´Ù. ÀÌ·¯ÇÑ Àç±ÍÀÇ ÀåÁ¡Àº TeXÀÌ \foo ´ÙÀ½ÀÇ À§Ä¡¸¦ ±â¾ïÇÒ ÇÊ¿ä°¡ ¾ø´Ù´Â Á¡ÀÔ´Ï´Ù. ¿Ö³ÄÇϸé \fooÀÇ Àü°³¸¦ ¸¶Ä¡°í ±× ´ÙÀ½À» °è¼Ó Àü°³Çϱâ À§Çؼ­ ±× À§Ä¡·Î ¿ÔÁö¸¸, Àü°³ÇÒ °ÍÀÌ ¾ø±â ¶§¹®ÀÔ´Ï´Ù. µû¶ó¼­ ÀÌ°æ¿ì´Â ½ºÅÿ¡ ´ÙÀ½¿¡ Àü°³ÇÒ ÅäÅ«ÀÇ À§Ä¡¸¦ ±â¾ïÇÒ ÇÊ¿äµµ ¾ø½À´Ï´Ù.!!! ÀÌ·¯ÇÑ °æ¿ì ó·³ Àç±Í È£ÃâÀÌ ¸Ç ¸¶Áö¸·¿¡ ÀÖ´Ù°í Çؼ­ "tail recursion" À̶ó°í ÇÕ´Ï´Ù. ¿ì¸®¸»·Î '²¿¸®Àç±Í'¶ó°íµµ ÇÕ´Ï´Ù. ÀÌÁ¦ TeXbook¿¡ ÀÌ tail recursionÀ» ¼³¸íÇϸ鼭 ÇÏ´Â ¸»,
..., and the memory does not fill up during a long loop. ...
À» ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

¶ÇÇÑ TeXbyTopic À̶ó´Â Ã¥ÀÇ 11.8.3 Tail recursion¿¡ ³ª¿ÍÀÖ´Â ´ÙÀ½°ú °°Àº ¸»µµ ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
In general this 'stack build-up' is a necessary evil, but it can be prevented if the nested macro call is the last token in the replacement text of the original macro. After the last token no further tokens need to be considered, so one might as well clear the top item from the input stack before a new one is put there. This is what TeX does.
¾î·Æ°Ô¸¸ º¸ÀÌ´ø TeXbyTopic À̶ó´Â Ã¥ÀÌ ¸¸¸¸ÇØ º¸ÀÔ´Ï´Ù. ½Å³³´Ï´Ù. :)

ÀÌÁ¦ ¾ÆÁÖ Àλó±íÀº ¸ÅÅ©·Î \loop ... \repeat¸¦ ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.
\def\loop#1\repeat{\def\body{#1}\iterate} \def\iterate{\body\let\next=\iterate\else\let\next=\relax\fi\next}
TeXÀ» °øºÎÇϸ鼭 Àú ¸ÅÅ©·Î¸¦ º¸°í ÀÌÇØÇÏ´Â ¼ø°£Àº ¾ÆÁÖ °¨µ¿ÀûÀ̾ú½À´Ï´Ù. ¼öÇÐÀÚµéÀÌ ÈçÈ÷ ¸»ÇÏ´Â °Í ó·³ "¾Æ¸§´ä½À´Ï´Ù."

¸¶Áö¸·À¸·Î Àú~~~ ¾Æ·¡¿¡¼­ ¾ð±ÞÇÑ KnuthÀÇ ¾î·ÏÀ» ¸¶Áö¸·À¸·Î À̹ø µ¶ÈÄ°¨À» ¸¶Ä¡°Ú½À´Ï´Ù. :) À§ÀÇ ¼³¸í¿¡¼­ ó·³ recursionÀº ¸Å¿ì ¿¤·¹°­½ºÇÏ°í °£´ÜÇÏÁö¸¸ ÄÄÇ»ÅÍ ÀÔÀå¿¡¼­ º¸¸é ±×¸® È¿À²ÀûÀÌÁö ¸øÇÕ´Ï´Ù. ½ºÅÃÀ̶ó´Â ¸Þ¸ð¸®¸¦ »ç¿ëÇؾߵǰí, À§Ä¡¸¦ ÀúÀåÇؾߵǰí... ±×¸®°í ´ë°³ Àç±ÍÀûÀ¸·Î Á¤ÀÇµÈ ¹®Á¦´Â ¹Ýº¹Àû(iterate)À¸·Î ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸, ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ùº¸¸é °¡²û recursionÀ» »ç¿ëÇÕ´Ï´Ù. ±× °£´Ü ¸í·áÇÔ¿¡ ¹ÝÇؼ­ ÀÌÁö¿ä. °°Àº ¸Æ¶ôÀ¸·Î Knuthµµ ¸»ÇßÁö¿ä?

"... aesthetics are more important than efficiency"

±ÛÀº Àç¹ÌÀÖ°Ô Àоú´Âµ¥ Àλó±íÀº ¸ÅÅ©·Î´Â ÀÌÇØ°¡ ¾ÈµÇ´Â ±º¿ä OTL -- hermian 2006-03-29 12:37:09

³ëÇöÁ¤ ¾Æ³ª¿î¼­°¡ ÀÌ·¸°Ô ¸»ÇßÀ» °ÍÀÔ´Ï´Ù. "hermian´Ô, °øºÎÇϼ¼¿ä" ;) -- ÀÛÀº³ª¹« 2006-03-29 14:13:19

µµ¿òÀÌ µÉ±î Çؼ­... 1ºÎÅÍ 100±îÁö ÇÑÁÙ¾¿ Ãâ·ÂÇϱâ:
\let\endgraph\par
\count255=0
\loop
  \advance\count255 by1
  \the\count255 \endgraph
  \ifnum\count255<100 \repeat
-- DohyunKim 2006-03-29 14:48:52

Àúµµ ¸î ÁÙ ±â¿©. ÀÌ ±â»çÀÇ ³»¿ë¿¡ ¾Ë¸Â°Ô... ^^ ;;
\let\endgraph\par

\newcount\n\newcount\i
\def\scatterline#1{\n=#1 \i=0 \putline}
\def\putline{%
	\ifnum\n>0 \else \multiply\n by-1 \fi
	\advance\i by1
	\number\i \endgraph
	\ifnum\i<\n \let\next=\putline
	\else\let\next=\relax\fi\next}

\scatterline{-100}

I have scattered to \number\n line by line.

\scatterline{10}

\bye
-- Karnes 2006-03-30 03:25:20

"¿äÁîÀ½ °øºÎÇϼ¼¿ä"°¡ À¯ÇàÀΰ¡ º¸³×¿ä. ȸ»ç¿¡¼­µµ µè°í ¤Ì¤Ì. °æ¹®»çÀÇ "TeX ÀÔ¹®"À» »ò´Âµ¥ º¼¸¸Çϳ׿ä. ¾ðÁ¦ º¸·Á³ª... ¸Ç³¯ ȸ»çÀÏ¿¡ Âɵé·Á »ç´Â Àλý. ¿¡Çì¶ó~ ´ÙÀ½¿¡ KTUG¸ðÀÓÀÖÀ½ ÀÛÀº³ª¹«´Ô Çѹø ºË°í½Í³×¿ä ¤¾¤¾ -- hermian 2006-03-30 10:03:11
À̸§:

¼­¸íÇÏÁö ¾Ê±â