{"data":{"site":{"siteMetadata":{"title":"lastrites2018","author":"lastrites2018","siteUrl":"https://lastrites2018.netlify.com","comment":{"disqusShortName":"","utterances":"lastrites2018/gatsby-first-blog"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"b3ebba14-e697-5cca-87fd-cbb6e1b4be62","excerpt":"Recursion Recursion, Recursive way 순환적 방법 자신 안에서 정의했던 함수를 다시 호출함. 모든 Recursion은 for나 while로 대신할 수 있다. -> 굉장히 면접에서 질문 많이 나오는 문제. BASIC FORM OF Recursive Function Base Case와 Termination condition을 꼭 만들어야 한다. 무한루프가 돌지 않도록 termination_condition -> invaild…","html":"<h1 id=\"recursion\"><a href=\"#recursion\" aria-label=\"recursion permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Recursion</h1>\n<ul>\n<li>Recursion, Recursive way 순환적 방법</li>\n</ul>\n<p>자신 안에서 정의했던 함수를 다시 호출함. 모든 Recursion은 for나 while로 대신할 수 있다.</p>\n<p>-> 굉장히 면접에서 질문 많이 나오는 문제.</p>\n<h2 id=\"basic-form-of-recursive-function\"><a href=\"#basic-form-of-recursive-function\" aria-label=\"basic form of recursive function permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>BASIC FORM OF Recursive Function</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> <span class=\"token function-variable function\">function_name</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>termination_condition<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// 종료조건 to prevent infinite recursion, invaild case</span>\n    <span class=\"token keyword\">return</span> value\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>base_case<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> value\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">//recursive case</span>\n\n  <span class=\"token keyword\">return</span> expression_with_recursion_call\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ol>\n<li>Base Case와 Termination condition을 꼭 만들어야 한다.</li>\n</ol>\n<p>무한루프가 돌지 않도록 termination_condition -> invaild 들어올 경우를 만들어줘야 한다.</p>\n<p>그냥 돌아가는 코드를 짜는 것도 중요하지만, 직관적인 코드를 짜는 것이 더 중요하다. 다른 사람이 쉽게 이해할 수 있는 코드를 짜는 것. 그래서 재귀 함수가 중요하다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// iterator way</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> a <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n    b <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n    temp\n\n  <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>num <span class=\"token operator\">>=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    temp <span class=\"token operator\">=</span> a\n    a <span class=\"token operator\">=</span> a <span class=\"token operator\">+</span> b\n    b <span class=\"token operator\">=</span> temp\n    num<span class=\"token operator\">--</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> b\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">//recursive way</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">fib</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">//num은 피보나치 인덱스</span>\n  <span class=\"token comment\">//base case</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> num\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">fib</span><span class=\"token punctuation\">(</span>num <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token function\">fib</span><span class=\"token punctuation\">(</span>num <span class=\"token operator\">-</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Recursion의 단점</p>\n<p>직관적인 코드를 짤 때는 좋지만, 호출 횟수가 지나치게 많다. 실행횟수가 급격히 증가. 따라서 메모이제이션 필요.</p>\n<p>Recursion USE CASES</p>\n<ul>\n<li>fibonacci numbers</li>\n<li>\n<p>tree traversal 트리 구조</p>\n<ul>\n<li>finding a node</li>\n<li>stringifyJSON -> json.org에서 정보 구할 수 있음. json도 트리구조.</li>\n<li>getElementsByClassName</li>\n</ul>\n</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//슈도 코드로 작성하는 먼저 작성하는 습관?\nfunction findNode(selector) {\ndocument.children.있니(selector)\n}</code></pre></div>\n<ul>\n<li>\n<p>메모이제이션</p>\n<p>input -> output</p>\n<p>{} key : value</p>\n<p>{} input : output</p>\n</li>\n</ul>\n<p>특정한 입력에 대한 함수의 결과는 변동되지 않으니까 캐싱할 수 있다. 메모이제이션을 사용하면, recursion을 좀 더 효율적으로 만들 수 있다. 리커시브 케이스일 경우에 메모이제이션 해주는 것은 알아둬야 할 기법.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">//슈도코드로 만든 메모이제이션 피보나치</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">memoizefib</span><span class=\"token punctuation\">(</span>num<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">//num은 피보나치 인덱스</span>\n  <span class=\"token keyword\">var</span> cache <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span> <span class=\"token comment\">//input : output</span>\n  <span class=\"token comment\">// base case</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token comment\">// fib(num-1)를 캐시에 있는지 확인해서 사용? 없으면 불러오기</span>\n  <span class=\"token comment\">//fib(num-2)</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">memoizefib</span><span class=\"token punctuation\">(</span>num <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token function\">memoizefib</span><span class=\"token punctuation\">(</span>num <span class=\"token operator\">-</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>길 찾기 문제, 계단 문제 같은 경우에 recursion으로 풀 수 있음.</p>\n<ul>\n<li>과제</li>\n</ul>\n<p>amazon coding interview question - recursive staircase problem</p>\n<p><a href=\"https://www.youtube.com/watch?v=5o-kdjv7FD0\">https://www.youtube.com/watch?v=5o-kdjv7FD0</a></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">//메모이제이션을 사용한 피보나치 함수</span>\n<span class=\"token keyword\">var</span> cache <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">fib</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">&lt;</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> n\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>cache<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    cache<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">fib</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">-</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token function\">fib</span><span class=\"token punctuation\">(</span>n <span class=\"token operator\">-</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">return</span> cache<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>","frontmatter":{"title":"Recursion 2","date":"August 01, 2018"}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"slug":"/til/20180801 Recursion/","previous":{"fields":{"slug":"/til/20180731/"},"frontmatter":{"title":"recursion basic","category":"TIL"}},"next":{"fields":{"slug":"/til/20180802 손병대 개발자 토크/"},"frontmatter":{"title":"손병대 개발자님 패널 토크 정리","category":"TIL"}}}}