<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
<head>
<title>Recursion</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="pandoc" />
<link rel="shortcut icon" href="icon.ico" />
<script src="common_en.js" charset="utf-8" type="text/javascript"></script> 
<link rel="stylesheet" href="common.css" type="text/css" />
</head>
<body onload="javascript:resetForms(); javascript:slidy_init();">
<div><h1 class="cover">Recursion</h1>
<div id="info"></div>
<ul>
<li><a href="#exercise-prelude.sum">Exercise: <code>Prelude.sum</code> [*]</a></li>
<li><a href="#exercise-prelude.last">Exercise: <code>Prelude.last</code> [*]</a></li>
<li><a href="#exercise-prelude.init">Exercise: <code>Prelude.init</code> [*]</a></li>
<li><a href="#exercise-prelude.minimum">Exercise: <code>Prelude.minimum</code> [*]</a></li>
<li><a href="#exercise-prelude.concat">Exercise: <code>Prelude.concat</code> [*]</a></li>
<li><a href="#exercise-prelude.">Exercise: <code>(Prelude.++)</code> [*]</a></li>
<li><a href="#exercise-merge-lists">Exercise: Merge Lists</a></li>
<li><a href="#exercise-prelude.zip">Exercise: <code>Prelude.zip</code> [*]</a></li>
<li><a href="#exercise-data.list.isprefixof">Exercise: <code>Data.List.isPrefixOf</code> [*]</a></li>
<li><a href="#exercise-prelude.elem">Exercise: <code>Prelude.elem</code> [*]</a></li>
<li><a href="#exercise-data.list.nub">Exercise: <code>Data.List.nub</code> [*]</a></li>
<li><a href="#exercise-evaluate-polynomial">Exercise: Evaluate Polynomial</a></li>
<li><a href="#exercise-split-list">Exercise: Split List</a></li>
<li><a href="#exercise-split-list-differently">Exercise: Split List Differently [*]</a></li>
<li><a href="#exercise-every-nth-element">Exercise: Every nth Element</a></li>
<li><a href="#exercise-quicksort">Exercise: Quicksort [*]</a></li>
<li><a href="#exercise-data.list.tails">Exercise: <code>Data.List.tails</code> [*]</a></li>
<li><a href="#exercise-data.list.inits">Exercise: <code>Data.List.inits</code></a></li>
<li><a href="#exercise-deletions-of-an-element-from-a-list">Exercise: Deletions of an Element from a List</a></li>
<li><a href="#exercise-insertions-of-an-element-to-a-list">Exercise: Insertions of an Element to a List</a></li>
<li><a href="#exercise-permutations">Exercise: Permutations</a></li>
<li><a href="#exercise-decompose-integer-into-sums">Exercise: Decompose Integer into Sums</a></li>
</ul>
</div>
<section id="exercise-prelude.sum" class="level1">
<h1>Exercise: <code>Prelude.sum</code> [*]</h1>
<p>Redefine the <code>sum</code> function which sums elements of a list of numbers.</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb1-1" data-line-number="1">sum<span class="ot"> ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</span> [a] <span class="ot">-&gt;</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_5b5cc650c9d4ff27927c06b1f01f1147.hs','5b5cc650c9d4ff27927c06b1f01f1147','5b5cc650c9d4ff27927c06b1f01f1147');"><textarea cols="80" rows="4" id="tarea5b5cc650c9d4ff27927c06b1f01f1147"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res5b5cc650c9d4ff27927c06b1f01f1147"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','fae6bfd1855620863849b8ff5966bd57','fae6bfd1855620863849b8ff5966bd57');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareafae6bfd1855620863849b8ff5966bd57" value="sum []" /><br /><div class="answer" id="resfae6bfd1855620863849b8ff5966bd57"><code class="result">0</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','dc5f5647aee39ab5776b56c9bcb13d07','dc5f5647aee39ab5776b56c9bcb13d07');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareadc5f5647aee39ab5776b56c9bcb13d07" value="sum [1,2,4]" /><br /><div class="answer" id="resdc5f5647aee39ab5776b56c9bcb13d07"><code class="result">7</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercise-prelude.last" class="level1">
<h1>Exercise: <code>Prelude.last</code> [*]</h1>
<p>Redefine the <code>last</code> function which returns the last element of a list.</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb2-1" data-line-number="1">last<span class="ot"> ::</span> [a]<span class="co">{-non-empty-}</span> <span class="ot">-&gt;</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_46254a0bc2333904fd641faaeda92e0c.hs','46254a0bc2333904fd641faaeda92e0c','46254a0bc2333904fd641faaeda92e0c');"><textarea cols="80" rows="4" id="tarea46254a0bc2333904fd641faaeda92e0c"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res46254a0bc2333904fd641faaeda92e0c"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','9b3299731e591d776e40e693cc98fb7d','9b3299731e591d776e40e693cc98fb7d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9b3299731e591d776e40e693cc98fb7d" value="last &quot;last&quot;" /><br /><div class="answer" id="res9b3299731e591d776e40e693cc98fb7d"><code class="result">'t'</code><code> :: </code><code class="type">Char</code></div></form>
</section>
<section id="exercise-prelude.init" class="level1">
<h1>Exercise: <code>Prelude.init</code> [*]</h1>
<p>Redefine the <code>init</code> function which returns all the elements of a list but the last.</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb3-1" data-line-number="1">init<span class="ot"> ::</span> [a]<span class="co">{-non-empty-}</span> <span class="ot">-&gt;</span> [a]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_49ddd00e23dccf8d5b1583b742fbedb7.hs','49ddd00e23dccf8d5b1583b742fbedb7','49ddd00e23dccf8d5b1583b742fbedb7');"><textarea cols="80" rows="4" id="tarea49ddd00e23dccf8d5b1583b742fbedb7"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res49ddd00e23dccf8d5b1583b742fbedb7"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','3ca3304d85afb7809f2cb1fd33b60cfb','3ca3304d85afb7809f2cb1fd33b60cfb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3ca3304d85afb7809f2cb1fd33b60cfb" value="init &quot;last&quot;" /><br /><div class="answer" id="res3ca3304d85afb7809f2cb1fd33b60cfb"><code class="result">&quot;las&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
</section>
<section id="exercise-prelude.minimum" class="level1">
<h1>Exercise: <code>Prelude.minimum</code> [*]</h1>
<p>Redefine the <code>minimum</code> function which returns the element with the smallest value in the list.</p>
<p>Hint: Use the <code>min</code> function which returns the smaller one from its two parameters.</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb4-1" data-line-number="1">minimum<span class="ot"> ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</span> [a]<span class="co">{-finite, non-empty-}</span> <span class="ot">-&gt;</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_ff0fd1892e637d91bf517eb192de4ee5.hs','ff0fd1892e637d91bf517eb192de4ee5','ff0fd1892e637d91bf517eb192de4ee5');"><textarea cols="80" rows="5" id="tareaff0fd1892e637d91bf517eb192de4ee5"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resff0fd1892e637d91bf517eb192de4ee5"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','a7bb922871ae21a4648dc47853747fce','a7bb922871ae21a4648dc47853747fce');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa7bb922871ae21a4648dc47853747fce" value="minimum [3,4,1,2]" /><br /><div class="answer" id="resa7bb922871ae21a4648dc47853747fce"><code class="result">1</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercise-prelude.concat" class="level1">
<h1>Exercise: <code>Prelude.concat</code> [*]</h1>
<p>Redefine the <code>concat</code> function which concatenates arbitrary number of lists of the same type of elements.</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb5-1" data-line-number="1">concat<span class="ot"> ::</span> [[a]] <span class="ot">-&gt;</span> [a]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_73fae9a589795a64af1c08630e4345ac.hs','73fae9a589795a64af1c08630e4345ac','73fae9a589795a64af1c08630e4345ac');"><textarea cols="80" rows="5" id="tarea73fae9a589795a64af1c08630e4345ac"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res73fae9a589795a64af1c08630e4345ac"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','508abb7654f1c63072598ffaef2388ae','508abb7654f1c63072598ffaef2388ae');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea508abb7654f1c63072598ffaef2388ae" value="concat []" /><br /><div class="answer" id="res508abb7654f1c63072598ffaef2388ae"><code class="result">[]</code><code> :: </code><code class="type">[()]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','87599cc928f3e2281bbfde0324be94a3','87599cc928f3e2281bbfde0324be94a3');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea87599cc928f3e2281bbfde0324be94a3" value="concat [[1,2], [3,4], [5,6]]" /><br /><div class="answer" id="res87599cc928f3e2281bbfde0324be94a3"><code class="result">[1, 2, 3, 4, 5, 6]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','520d4ebde1466be813bef3670cf32904','520d4ebde1466be813bef3670cf32904');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea520d4ebde1466be813bef3670cf32904" value="concat [[1..i] | i &lt;- [1..5]]" /><br /><div class="answer" id="res520d4ebde1466be813bef3670cf32904"><code class="result">[1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<div class="handout">
<hr />
<p>Operation:</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="co">--    concat [[1,2], [3,4], [5,6]]</span></a>
<a class="sourceLine" id="cb6-2" data-line-number="2"><span class="co">-- == concat ([1,2]: [3,4]: [5,6]: [])</span></a>
<a class="sourceLine" id="cb6-3" data-line-number="3"><span class="co">-- == [1,2] ++ concat ([3,4]: [5,6]: [])</span></a>
<a class="sourceLine" id="cb6-4" data-line-number="4"><span class="co">-- == [1,2] ++ [3,4] ++ concat ([5,6]: [])</span></a>
<a class="sourceLine" id="cb6-5" data-line-number="5"><span class="co">-- == [1,2] ++ [3,4] ++ [5,6] ++ concat []</span></a>
<a class="sourceLine" id="cb6-6" data-line-number="6"><span class="co">-- == [1,2] ++ [3,4] ++ [5,6] ++ []</span></a>
<a class="sourceLine" id="cb6-7" data-line-number="7"><span class="co">-- == [1, 2, 3, 4, 5, 6]</span></a></code></pre></div>
</div>
</section>
<section id="exercise-prelude." class="level1">
<h1>Exercise: <code>(Prelude.++)</code> [*]</h1>
<p>Redefine the <code>(++)</code> operator which concatenates two lists.</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="ot">(++) ::</span> [a] <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> [a]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_d0dbbea1f6a4bc4e2d584697866b37f5.hs','d0dbbea1f6a4bc4e2d584697866b37f5','d0dbbea1f6a4bc4e2d584697866b37f5');"><textarea cols="80" rows="5" id="taread0dbbea1f6a4bc4e2d584697866b37f5"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resd0dbbea1f6a4bc4e2d584697866b37f5"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','3e1522cd6f3668478a2586df043d374f','3e1522cd6f3668478a2586df043d374f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3e1522cd6f3668478a2586df043d374f" value="[1..5] ++ [7..10] " /><br /><div class="answer" id="res3e1522cd6f3668478a2586df043d374f"><code class="result">[1, 2, 3, 4, 5, 7, 8, 9, 10]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','3155afb86b3910d2e4cc1b9216af3b74','3155afb86b3910d2e4cc1b9216af3b74');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea3155afb86b3910d2e4cc1b9216af3b74" value="[1..10] `isPrefixOf` ([1..] ++ [-1])" /><br /><div class="answer" id="res3155afb86b3910d2e4cc1b9216af3b74"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-merge-lists" class="level1">
<h1>Exercise: Merge Lists</h1>
<p>Define a function to merge lists. The resulting should contain elements of both input lists ordered.</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb8-1" data-line-number="1"><span class="ot">merge ::</span> [a] <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> [a]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_f54109c2f8b4246e545fce470ed1c58e.hs','f54109c2f8b4246e545fce470ed1c58e','f54109c2f8b4246e545fce470ed1c58e');"><textarea cols="80" rows="4" id="tareaf54109c2f8b4246e545fce470ed1c58e"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resf54109c2f8b4246e545fce470ed1c58e"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','446c5f4564c99d93a1cfe87b7b3e8107','446c5f4564c99d93a1cfe87b7b3e8107');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea446c5f4564c99d93a1cfe87b7b3e8107" value="[1,2,3] `merge` [4,5,6]" /><br /><div class="answer" id="res446c5f4564c99d93a1cfe87b7b3e8107"><code class="result">[1, 4, 2, 5, 3, 6]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','2d41fdddd7133d2a56cca8a8403be73e','2d41fdddd7133d2a56cca8a8403be73e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea2d41fdddd7133d2a56cca8a8403be73e" value="[]      `merge` [4,5,6]" /><br /><div class="answer" id="res2d41fdddd7133d2a56cca8a8403be73e"><code class="result">[4, 5, 6]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','73295bc8fd3921df21a4b129488e53a4','73295bc8fd3921df21a4b129488e53a4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea73295bc8fd3921df21a4b129488e53a4" value="[3,4]   `merge` [0]" /><br /><div class="answer" id="res73295bc8fd3921df21a4b129488e53a4"><code class="result">[3, 0, 4]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
<section id="exercise-prelude.zip" class="level1">
<h1>Exercise: <code>Prelude.zip</code> [*]</h1>
<p>Redefine the function for combining lists into a list of pairs (which is called “zipping”).</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb9-1" data-line-number="1">zip<span class="ot"> ::</span> [a] <span class="ot">-&gt;</span> [b] <span class="ot">-&gt;</span> [(a,b)]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_efec3a867db8da6a91df3c0360ffe4ee.hs','efec3a867db8da6a91df3c0360ffe4ee','efec3a867db8da6a91df3c0360ffe4ee');"><textarea cols="80" rows="4" id="tareaefec3a867db8da6a91df3c0360ffe4ee"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resefec3a867db8da6a91df3c0360ffe4ee"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','e84fc183236b543604eba74044b4a880','e84fc183236b543604eba74044b4a880');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae84fc183236b543604eba74044b4a880" value="zip [1,2] &quot;abc&quot;" /><br /><div class="answer" id="rese84fc183236b543604eba74044b4a880"><code class="result">[(1, 'a'), (2, 'b')]</code><code> :: </code><code class="type">[(Integer, Char)]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','f60267a885fb3a643858f9be04cc2c2f','f60267a885fb3a643858f9be04cc2c2f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf60267a885fb3a643858f9be04cc2c2f" value="zip [1..] ['a'..'f']" /><br /><div class="answer" id="resf60267a885fb3a643858f9be04cc2c2f"><code class="result">[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f')]</code><code> :: </code><code class="type">[(Integer, Char)]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','4311621342344fb13fc3c6645fa23cae','4311621342344fb13fc3c6645fa23cae');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4311621342344fb13fc3c6645fa23cae" value="zip [1,3..] [2,4..100]" /><br /><div class="answer" id="res4311621342344fb13fc3c6645fa23cae"><code class="result">[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14),
 (15, 16), (17, 18), (19, 20), (21, 22), (23, 24), (25, 26),
 (27, 28), (29, 30), (31, 32), (33, 34), (35, 36), (37, 38),
 (39, 40), (41, 42), (43, 44), (45, 46), (47, 48), (49, 50),
 (51, 52), (53, 54), (55, 56), (57, 58), (59, 60), (61, 62),
 (63, 64), (65, 66), (67, 68), (69, 70), (71, 72), (73, 74),
 (75, 76), (77, 78), (79, 80), (81, 82), (83, 84), (85, 86),
 (87, 88), (89, 90), (91, 92), (93, 94), (95, 96), (97, 98),
 (99, 100)]</code><code> :: </code><code class="type">[(Integer, Integer)]</code></div></form>
</section>
<section id="exercise-data.list.isprefixof" class="level1">
<h1>Exercise: <code>Data.List.isPrefixOf</code> [*]</h1>
<p>Redefine the <code>isPrefixOf</code> function from the <code>Data.List</code> module which determines if the second parameter starts with the first parameter (and contains it entirely). If this is true, then we say that the first parameter is the prefix of the second.</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="ot">isPrefixOf ::</span> <span class="dt">Eq</span> a <span class="ot">=&gt;</span> [a] <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_bbc22039849fc7df1d510b7cf2b36d71.hs','bbc22039849fc7df1d510b7cf2b36d71','bbc22039849fc7df1d510b7cf2b36d71');"><textarea cols="80" rows="5" id="tareabbc22039849fc7df1d510b7cf2b36d71"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resbbc22039849fc7df1d510b7cf2b36d71"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','0a293560e1ed03ac360ab95945752aba','0a293560e1ed03ac360ab95945752aba');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0a293560e1ed03ac360ab95945752aba" value="&quot;foo&quot; `isPrefixOf` &quot;foobar&quot;" /><br /><div class="answer" id="res0a293560e1ed03ac360ab95945752aba"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','4cb72ee2e3bbe4de5c05ec9c8e269270','4cb72ee2e3bbe4de5c05ec9c8e269270');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea4cb72ee2e3bbe4de5c05ec9c8e269270" value="&quot;foo&quot; `isPrefixOf` &quot;foo&quot;" /><br /><div class="answer" id="res4cb72ee2e3bbe4de5c05ec9c8e269270"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','ff96221a0e5c0131a241a8160ae3cb6e','ff96221a0e5c0131a241a8160ae3cb6e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaff96221a0e5c0131a241a8160ae3cb6e" value="not (&quot;foobar&quot; `isPrefixOf` &quot;foo&quot;)" /><br /><div class="answer" id="resff96221a0e5c0131a241a8160ae3cb6e"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','82d4b5ab735d94b6a0cdf64150c506ae','82d4b5ab735d94b6a0cdf64150c506ae');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea82d4b5ab735d94b6a0cdf64150c506ae" value="not (&quot;bar&quot; `isPrefixOf` &quot;foobar&quot;)" /><br /><div class="answer" id="res82d4b5ab735d94b6a0cdf64150c506ae"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','c84f3fe261349cd68be1674d635abf21','c84f3fe261349cd68be1674d635abf21');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareac84f3fe261349cd68be1674d635abf21" value="[1,2,3] `isPrefixOf` [1..]" /><br /><div class="answer" id="resc84f3fe261349cd68be1674d635abf21"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-prelude.elem" class="level1">
<h1>Exercise: <code>Prelude.elem</code> [*]</h1>
<p>Redefine the <code>elem</code> function which decides a value is element of a list.</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb11-1" data-line-number="1">elem<span class="ot"> ::</span> <span class="dt">Eq</span> a <span class="ot">=&gt;</span> a <span class="ot">-&gt;</span> [a]<span class="co">{-finite-}</span> <span class="ot">-&gt;</span> <span class="dt">Bool</span></a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_edc19726edb20261ec2627658b29cd28.hs','edc19726edb20261ec2627658b29cd28','edc19726edb20261ec2627658b29cd28');"><textarea cols="80" rows="5" id="tareaedc19726edb20261ec2627658b29cd28"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resedc19726edb20261ec2627658b29cd28"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','64028199b19a075ec4c11a10f4e36e21','64028199b19a075ec4c11a10f4e36e21');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea64028199b19a075ec4c11a10f4e36e21" value="elem 1 [1..10]" /><br /><div class="answer" id="res64028199b19a075ec4c11a10f4e36e21"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','7c428570601cedcb3fc0e2008f6b7f70','7c428570601cedcb3fc0e2008f6b7f70');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7c428570601cedcb3fc0e2008f6b7f70" value="not (elem 0 [1..10])" /><br /><div class="answer" id="res7c428570601cedcb3fc0e2008f6b7f70"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
</section>
<section id="exercise-data.list.nub" class="level1">
<h1>Exercise: <code>Data.List.nub</code> [*]</h1>
<p>Redefine the <code>nub</code> function from the <code>Data.List</code> module. The <code>nub</code> function is to remove duplicate elements from a list.</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="ot">nub ::</span> <span class="dt">Eq</span> a <span class="ot">=&gt;</span> [a] <span class="ot">-&gt;</span> [a]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_3e61bca2def0373d0f1f67e9a02d2153.hs','3e61bca2def0373d0f1f67e9a02d2153','3e61bca2def0373d0f1f67e9a02d2153');"><textarea cols="80" rows="5" id="tarea3e61bca2def0373d0f1f67e9a02d2153"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res3e61bca2def0373d0f1f67e9a02d2153"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','d0cf435c065e5415b70d6e253b626155','d0cf435c065e5415b70d6e253b626155');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="taread0cf435c065e5415b70d6e253b626155" value="nub [1,1,2,1,1,2,2,3] " /><br /><div class="answer" id="resd0cf435c065e5415b70d6e253b626155"><code class="result">[1, 2, 3]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','22c7514f269858c266ea933170d844f0','22c7514f269858c266ea933170d844f0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea22c7514f269858c266ea933170d844f0" value="nub [1,3,2,1,1,2,2,3,1] " /><br /><div class="answer" id="res22c7514f269858c266ea933170d844f0"><code class="result">[1, 3, 2]</code><code> :: </code><code class="type">[Integer]</code></div></form>
</section>
<section id="exercise-evaluate-polynomial" class="level1">
<h1>Exercise: Evaluate Polynomial</h1>
<p>Evaluate a polynomial given by its coefficients at a given point.</p>
<div class="sourceCode" id="cb13"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="ot">polinom ::</span> <span class="dt">Num</span> a <span class="ot">=&gt;</span> [a] <span class="ot">-&gt;</span> a <span class="ot">-&gt;</span> a</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_86dcfdeff2f3b9f91d57930a8dbe6b8f.hs','86dcfdeff2f3b9f91d57930a8dbe6b8f','86dcfdeff2f3b9f91d57930a8dbe6b8f');"><textarea cols="80" rows="4" id="tarea86dcfdeff2f3b9f91d57930a8dbe6b8f"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res86dcfdeff2f3b9f91d57930a8dbe6b8f"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','b745bb403312b262f189f73e9392b781','b745bb403312b262f189f73e9392b781');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab745bb403312b262f189f73e9392b781" value="polinom [] 3" /><br /><div class="answer" id="resb745bb403312b262f189f73e9392b781"><code class="result">0</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','46a07cb84b0da8a6faace9169a3866c1','46a07cb84b0da8a6faace9169a3866c1');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea46a07cb84b0da8a6faace9169a3866c1" value="polinom [3,1,2,7] 4" /><br /><div class="answer" id="res46a07cb84b0da8a6faace9169a3866c1"><code class="result">487</code><code> :: </code><code class="type">Integer</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','8e030c65cd31ed83e7d39774341be388','8e030c65cd31ed83e7d39774341be388');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea8e030c65cd31ed83e7d39774341be388" value="polinom [1,3,1,4,7] 5" /><br /><div class="answer" id="res8e030c65cd31ed83e7d39774341be388"><code class="result">4916</code><code> :: </code><code class="type">Integer</code></div></form>
</section>
<section id="exercise-split-list" class="level1">
<h1>Exercise: Split List</h1>
<p>Split a list into segments of a given length.</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb14-1" data-line-number="1"><span class="ot">runs ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> [[a]]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_5fd668feb5541fdab0721695c6c8d23a.hs','5fd668feb5541fdab0721695c6c8d23a','5fd668feb5541fdab0721695c6c8d23a');"><textarea cols="80" rows="5" id="tarea5fd668feb5541fdab0721695c6c8d23a"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res5fd668feb5541fdab0721695c6c8d23a"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','b2b5bd07ab725fffbfa66cb0f0e4425a','b2b5bd07ab725fffbfa66cb0f0e4425a');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareab2b5bd07ab725fffbfa66cb0f0e4425a" value="runs 3 [1..10]" /><br /><div class="answer" id="resb2b5bd07ab725fffbfa66cb0f0e4425a"><code class="result">[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
</section>
<section id="exercise-split-list-differently" class="level1">
<h1>Exercise: Split List Differently [*]</h1>
<p>Split a list into segments of lengths given in another list.</p>
<div class="sourceCode" id="cb15"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb15-1" data-line-number="1"><span class="ot">slice ::</span> [<span class="dt">Int</span>] <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> [[a]]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_29149bdbeb222538ebaa5c437d44599c.hs','29149bdbeb222538ebaa5c437d44599c','29149bdbeb222538ebaa5c437d44599c');"><textarea cols="80" rows="4" id="tarea29149bdbeb222538ebaa5c437d44599c"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res29149bdbeb222538ebaa5c437d44599c"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','1b35b8ff6770d1bbff9fe069f52d59ac','1b35b8ff6770d1bbff9fe069f52d59ac');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1b35b8ff6770d1bbff9fe069f52d59ac" value="slice [3,2,3]     [1..10]" /><br /><div class="answer" id="res1b35b8ff6770d1bbff9fe069f52d59ac"><code class="result">[[1, 2, 3], [4, 5], [6, 7, 8]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','0d6b9394c8191456fb4543fe2caed4f6','0d6b9394c8191456fb4543fe2caed4f6');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea0d6b9394c8191456fb4543fe2caed4f6" value="slice [3,2,3,4,2] [1..10]" /><br /><div class="answer" id="res0d6b9394c8191456fb4543fe2caed4f6"><code class="result">[[1, 2, 3], [4, 5], [6, 7, 8], [9, 10], []]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
</section>
<section id="exercise-every-nth-element" class="level1">
<h1>Exercise: Every nth Element</h1>
<p>Define the <code>every</code> function which takes every nth of a list.</p>
<div class="sourceCode" id="cb16"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="ot">every ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> [a]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_8cb5a9a1e9512d657661f6545c6b63c5.hs','8cb5a9a1e9512d657661f6545c6b63c5','8cb5a9a1e9512d657661f6545c6b63c5');"><textarea cols="80" rows="5" id="tarea8cb5a9a1e9512d657661f6545c6b63c5"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res8cb5a9a1e9512d657661f6545c6b63c5"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','bcc9ae45d8c5b7feb6a932c0999a70b4','bcc9ae45d8c5b7feb6a932c0999a70b4');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareabcc9ae45d8c5b7feb6a932c0999a70b4" value="every 2 &quot;Hello World&quot;" /><br /><div class="answer" id="resbcc9ae45d8c5b7feb6a932c0999a70b4"><code class="result">&quot;HloWrd&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','1c65d4efcda3543a5832acfd975d6a8e','1c65d4efcda3543a5832acfd975d6a8e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea1c65d4efcda3543a5832acfd975d6a8e" value="every 3 &quot;Hello World&quot;" /><br /><div class="answer" id="res1c65d4efcda3543a5832acfd975d6a8e"><code class="result">&quot;HlWl&quot;</code><code> :: </code><code class="type">[Char]</code></div></form>
</section>
<section id="exercise-quicksort" class="level1">
<h1>Exercise: Quicksort [*]</h1>
<p>Define the quicksort (where a list is partitioned into elements smaller and larger than its head).</p>
<div class="sourceCode" id="cb17"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="ot">qsort ::</span> <span class="dt">Ord</span> a <span class="ot">=&gt;</span> [a] <span class="ot">-&gt;</span> [a]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_af4437e1adef73053bc6d6af5d521ac4.hs','af4437e1adef73053bc6d6af5d521ac4','af4437e1adef73053bc6d6af5d521ac4');"><textarea cols="80" rows="5" id="tareaaf4437e1adef73053bc6d6af5d521ac4"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resaf4437e1adef73053bc6d6af5d521ac4"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','a9963efa9b5f44438442ffd2d6ac00a6','a9963efa9b5f44438442ffd2d6ac00a6');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa9963efa9b5f44438442ffd2d6ac00a6" value="qsort [3,2,4,6,1] " /><br /><div class="answer" id="resa9963efa9b5f44438442ffd2d6ac00a6"><code class="result">[1, 2, 3, 4, 6]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','776b47aebb1f2274cbc1f1042de8f71f','776b47aebb1f2274cbc1f1042de8f71f');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea776b47aebb1f2274cbc1f1042de8f71f" value="qsort [1,2,6,1] " /><br /><div class="answer" id="res776b47aebb1f2274cbc1f1042de8f71f"><code class="result">[1, 1, 2, 6]</code><code> :: </code><code class="type">[Integer]</code></div></form>
<div class="handout">
<hr />
<p>Note: The current definition of <code>qsort</code> is not efficient for ordered and inversely ordered lists.</p>
<p><img src="Recursion_en5caec50b2eb5112142ee020dc98a172d.png" alt="Recursion_en5caec50b2eb5112142ee020dc98a172d.png" /></p>
<p>Red arrow: Elements smaller than the head in the tail. Grey arrow: Head of the list. Blue arrow: Elements larger than the head in the tail. Green arrows: Concatenation.</p>
<p>For a random list:</p>
<p><img src="Recursion_en677f36fe8687a43b35f6297cff9ec42e.png" alt="Recursion_en677f36fe8687a43b35f6297cff9ec42e.png" /></p>
<p>For ordered lists, <code>qsort</code> runs in linear time because the time required for concatenating the two lists is proportinal to the length of the first list.</p>
<p>Visually:</p>
<p><img src="Recursion_en1251cc4d1f425d55ca173cccb9c45b60.png" alt="Recursion_en1251cc4d1f425d55ca173cccb9c45b60.png" /></p>
<p>For inversely ordered lists, <code>qsort</code> runs in quadratic time, because the time required for concatenating the two lists is proportional to the length of the first list.</p>
<p>Visually:</p>
<p><img src="Recursion_enf555b9e42e33335dbae34d1dc42732ec.png" alt="Recursion_enf555b9e42e33335dbae34d1dc42732ec.png" /></p>
</div>
</section>
<section id="exercise-data.list.tails" class="level1">
<h1>Exercise: <code>Data.List.tails</code> [*]</h1>
<p>Generate all possible suffices for a list. (This function is already defined in the <code>Data.List</code> module.)</p>
<div class="sourceCode" id="cb18"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="ot">tails ::</span> [a] <span class="ot">-&gt;</span> [[a]] </a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_ae8f66268bb38ef28c96ebf7e787c733.hs','ae8f66268bb38ef28c96ebf7e787c733','ae8f66268bb38ef28c96ebf7e787c733');"><textarea cols="80" rows="4" id="tareaae8f66268bb38ef28c96ebf7e787c733"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resae8f66268bb38ef28c96ebf7e787c733"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','6acdee399c1c6187cd464206700b2acb','6acdee399c1c6187cd464206700b2acb');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6acdee399c1c6187cd464206700b2acb" value="tails &quot;abc&quot;" /><br /><div class="answer" id="res6acdee399c1c6187cd464206700b2acb"><code class="result">[&quot;abc&quot;, &quot;bc&quot;, &quot;c&quot;, []]</code><code> :: </code><code class="type">[[Char]]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','32dd8dac592e00b06e714b76d8eadf66','32dd8dac592e00b06e714b76d8eadf66');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea32dd8dac592e00b06e714b76d8eadf66" value="tails [1,2,3,4]" /><br /><div class="answer" id="res32dd8dac592e00b06e714b76d8eadf66"><code class="result">[[1, 2, 3, 4], [2, 3, 4], [3, 4], [4], []]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
</section>
<section id="exercise-data.list.inits" class="level1">
<h1>Exercise: <code>Data.List.inits</code></h1>
<p>Generate all possible prefices for a list. (This function is already defined in the <code>Data.List</code> module.)</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb19-1" data-line-number="1"><span class="ot">inits ::</span> [a] <span class="ot">-&gt;</span> [[a]]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_08b64b988c7e4cbd097695034b0462bb.hs','08b64b988c7e4cbd097695034b0462bb','08b64b988c7e4cbd097695034b0462bb');"><textarea cols="80" rows="4" id="tarea08b64b988c7e4cbd097695034b0462bb"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res08b64b988c7e4cbd097695034b0462bb"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','e04ebd9af12ee8f7b5183d132198151e','e04ebd9af12ee8f7b5183d132198151e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareae04ebd9af12ee8f7b5183d132198151e" value="inits &quot;abc&quot;" /><br /><div class="answer" id="rese04ebd9af12ee8f7b5183d132198151e"><code class="result">[[], &quot;a&quot;, &quot;ab&quot;, &quot;abc&quot;]</code><code> :: </code><code class="type">[[Char]]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','32235ffa89210a5ba669b226b79ff553','32235ffa89210a5ba669b226b79ff553');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea32235ffa89210a5ba669b226b79ff553" value="inits [1,2,3]" /><br /><div class="answer" id="res32235ffa89210a5ba669b226b79ff553"><code class="result">[[], [1], [1, 2], [1, 2, 3]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
</section>
<section id="exercise-deletions-of-an-element-from-a-list" class="level1">
<h1>Exercise: Deletions of an Element from a List</h1>
<p>Delete an element from a list in all possible ways.</p>
<div class="sourceCode" id="cb20"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb20-1" data-line-number="1"><span class="ot">deletions ::</span> [a] <span class="ot">-&gt;</span> [[a]]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_769f36781bfa239a8313bcc22e6eae24.hs','769f36781bfa239a8313bcc22e6eae24','769f36781bfa239a8313bcc22e6eae24');"><textarea cols="80" rows="5" id="tarea769f36781bfa239a8313bcc22e6eae24"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res769f36781bfa239a8313bcc22e6eae24"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','f85e29c49a113203091f0bee110fdf56','f85e29c49a113203091f0bee110fdf56');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf85e29c49a113203091f0bee110fdf56" value="null (deletions [])" /><br /><div class="answer" id="resf85e29c49a113203091f0bee110fdf56"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','6fe4b78e24d14eba74d1c04b4806181c','6fe4b78e24d14eba74d1c04b4806181c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea6fe4b78e24d14eba74d1c04b4806181c" value="deletions [1]      " /><br /><div class="answer" id="res6fe4b78e24d14eba74d1c04b4806181c"><code class="result">[[]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','7b95b897fd22c2e474afae847b11d350','7b95b897fd22c2e474afae847b11d350');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea7b95b897fd22c2e474afae847b11d350" value="deletions [1,2,3,2]" /><br /><div class="answer" id="res7b95b897fd22c2e474afae847b11d350"><code class="result">[[2, 3, 2], [1, 3, 2], [1, 2, 2], [1, 2, 3]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
</section>
<section id="exercise-insertions-of-an-element-to-a-list" class="level1">
<h1>Exercise: Insertions of an Element to a List</h1>
<p>Insert an element into a list in all possible ways.</p>
<div class="sourceCode" id="cb21"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb21-1" data-line-number="1"><span class="ot">insertions ::</span> a <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> [[a]]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_76b7b3ddf7658446bb2ef06a848fb3cc.hs','76b7b3ddf7658446bb2ef06a848fb3cc','76b7b3ddf7658446bb2ef06a848fb3cc');"><textarea cols="80" rows="4" id="tarea76b7b3ddf7658446bb2ef06a848fb3cc"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res76b7b3ddf7658446bb2ef06a848fb3cc"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','f80273b89a58276e535ae81eb134f8e9','f80273b89a58276e535ae81eb134f8e9');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaf80273b89a58276e535ae81eb134f8e9" value="insertions 1 []   " /><br /><div class="answer" id="resf80273b89a58276e535ae81eb134f8e9"><code class="result">[[1]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','abbc0582e964f00afbf83bb788638b33','abbc0582e964f00afbf83bb788638b33');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaabbc0582e964f00afbf83bb788638b33" value="insertions 1 [2,3]" /><br /><div class="answer" id="resabbc0582e964f00afbf83bb788638b33"><code class="result">[[1, 2, 3], [2, 1, 3], [2, 3, 1]]</code><code> :: </code><code class="type">[[Integer]]</code></div></form>
</section>
<section id="exercise-permutations" class="level1">
<h1>Exercise: Permutations</h1>
<p>Give all the possible permutations for a list.</p>
<div class="sourceCode" id="cb22"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb22-1" data-line-number="1"><span class="ot">permutations ::</span> [a] <span class="ot">-&gt;</span> [[a]]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_6457b098cbf99edf9fae5380d96ef5ca.hs','6457b098cbf99edf9fae5380d96ef5ca','6457b098cbf99edf9fae5380d96ef5ca');"><textarea cols="80" rows="4" id="tarea6457b098cbf99edf9fae5380d96ef5ca"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="res6457b098cbf99edf9fae5380d96ef5ca"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','cfe6ba42502158dfecede567ae932f6c','cfe6ba42502158dfecede567ae932f6c');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareacfe6ba42502158dfecede567ae932f6c" value="permutations &quot;123&quot; " /><br /><div class="answer" id="rescfe6ba42502158dfecede567ae932f6c"><code class="result">[&quot;123&quot;, &quot;213&quot;, &quot;231&quot;, &quot;132&quot;, &quot;312&quot;, &quot;321&quot;]</code><code> :: </code><code class="type">[[Char]]</code></div></form>
<p>[“123”,“213”,“231”,“132”,“312”,“321”]</p>
<div class="handout">
<hr />
<p><img src="Recursion_enc1245aa36815634046f21e815a3b9e0d.png" alt="Recursion_enc1245aa36815634046f21e815a3b9e0d.png" /></p>
<p>Grey arrows: Splitting the list into head and tail. Red arrows: Permutation (recursive call). Blue arrows: Applying <code>insertions</code>.</p>
<p>Furthermore:</p>
<p><img src="Recursion_en41ba73aceaa29ed3ccdbc7361a3ba3bf.png" alt="Recursion_en41ba73aceaa29ed3ccdbc7361a3ba3bf.png" /></p>
</div>
</section>
<section id="exercise-decompose-integer-into-sums" class="level1">
<h1>Exercise: Decompose Integer into Sums</h1>
<div class="sourceCode" id="cb23"><pre class="sourceCode haskell"><code class="sourceCode haskell"><a class="sourceLine" id="cb23-1" data-line-number="1"><span class="ot">part ::</span> <span class="dt">Int</span> <span class="ot">-&gt;</span> [[<span class="dt">Int</span>]]</a></code></pre></div>
<div class="indent"><form class="interpreter" action="javascript:getOne('c=check&amp;f=Recursion_en_d21d00d778225541ffdf30a83def8e8a.hs','d21d00d778225541ffdf30a83def8e8a','d21d00d778225541ffdf30a83def8e8a');"><textarea cols="80" rows="4" id="taread21d00d778225541ffdf30a83def8e8a"></textarea><br /><input type="submit" value="Check" /></form><div class="answer" id="resd21d00d778225541ffdf30a83def8e8a"></div></div>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','a4ea5b508641e9b375278da0a584d627','a4ea5b508641e9b375278da0a584d627');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa4ea5b508641e9b375278da0a584d627" value="part 0  ==  [[]]" /><br /><div class="answer" id="resa4ea5b508641e9b375278da0a584d627"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','a3a6f5e46123cfb678be3d830181eb2d','a3a6f5e46123cfb678be3d830181eb2d');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tareaa3a6f5e46123cfb678be3d830181eb2d" value="part 1  ==  [[1]]" /><br /><div class="answer" id="resa3a6f5e46123cfb678be3d830181eb2d"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','9b3631e12ce7402ab945b6e44db03b54','9b3631e12ce7402ab945b6e44db03b54');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea9b3631e12ce7402ab945b6e44db03b54" value="part 2  ==  [[2], [1,1]]" /><br /><div class="answer" id="res9b3631e12ce7402ab945b6e44db03b54"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','97bc8005a034eed417d7d04409b5018e','97bc8005a034eed417d7d04409b5018e');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea97bc8005a034eed417d7d04409b5018e" value="part 3  ==  [[3], [2,1], [1,2], [1,1,1]]" /><br /><div class="answer" id="res97bc8005a034eed417d7d04409b5018e"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<form class="resetinterpreter" action="javascript:getOne('c=eval&amp;f=Recursion_en.hs','42cb6b9b9af11c9e0618dc237329b1b0','42cb6b9b9af11c9e0618dc237329b1b0');"><code class="prompt">Test&gt; </code><input class="interpreter" type="text" size="80" id="tarea42cb6b9b9af11c9e0618dc237329b1b0" value="part 4  ==  [[4],[3,1],[2,2],[2,1,1],[1,3],[1,2,1],[1,1,2],[1,1,1,1]]" /><br /><div class="answer" id="res42cb6b9b9af11c9e0618dc237329b1b0"><code class="result">True</code><code> :: </code><code class="type">Bool</code></div></form>
<p>Decompose an integer into sums in all possible ways.</p>
<p>Each sum is represented as a list (e.g. <code>1 + 2 + 4</code> is representead as <code>[1,2,4]</code>).</p>
<p>Let the ordering matter in the sum (i.e. <code>1 + 2</code> and <code>2 + 1</code> are different decompositions).</p>
<p>Hint: The algorithm is as follows.</p>
<p>If we want to decompose the integer <code>4</code> in all possible way, then it can be done in the following way:</p>
<ul>
<li><code>4</code> is a decomposition of <code>4</code>.</li>
<li><code>3 + x</code> is a decomposition of <code>4</code> if <code>x</code> is a decomposition of <code>1</code>. Since <code>1</code> can be only decomposed in one way, this will give us <code>3 + 1</code>.</li>
<li><code>2 + x</code> is a decomposition of <code>4</code> if <code>x</code> is a decomposition of <code>2</code>. Since decompositions of <code>2</code> are <code>2</code> and <code>1 + 1</code>, this will give us <code>3 + 2</code> and <code>3 + 1 + 1</code>.</li>
<li><code>1 + x</code> is a decomposition of <code>4</code> if <code>x</code> is a decomposition of <code>3</code>. Since decompositions of <code>3</code> are <code>3</code>, <code>2 + 1</code>, <code>1 + 2</code>, and <code>1 + 1 + 1</code>, this will give us <code>1 + 3</code>, <code>1 + 2 + 1</code>, <code>1 + 1 + 2</code>, and <code>1 + 1 + 1 + 1</code>.</li>
</ul>
<p>We called the <code>part</code> function in each case. Then we concatenate the results of all the four cases.</p>
</section>
</body>
</html>

