<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Flying memes &#187; Tail Recursion</title>
	<atom:link href="http://sandropaganotti.com/tag/tail-recursion/feed/" rel="self" type="application/rss+xml" />
	<link>http://sandropaganotti.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 08 Jan 2012 16:00:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Golf Programming: permutazioni</title>
		<link>http://sandropaganotti.com/2009/06/28/golf-programming-permutazioni/</link>
		<comments>http://sandropaganotti.com/2009/06/28/golf-programming-permutazioni/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 10:27:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Golf Programming]]></category>
		<category><![CDATA[Permutazioni]]></category>
		<category><![CDATA[Tail Recursion]]></category>

		<guid isPermaLink="false">http://sandropaganotti.com/?p=170</guid>
		<description><![CDATA[Questa volta Eineki ci propone un quiz classico che però presenta sempre interessanti spunti: le permutazioni. Ecco la mia soluzione, sono 100 caratteri: def k(l,n);l==''?n:l.split(//).map{&#124;s&#124;k(l.sub(s,''),n+s)}end;p k((ARGV[0]&#124;&#124;"abcd"),'').flatten.uniq Per questa soluzione mi sono inspirato ad una bellissima funzione scritta in Erlang: permutation([]) -&#62; [[]]; permutation(L) -&#62; [[H&#124;T] &#124;&#124; H &#60;- L, T &#60;- permutation(L--[H])]. Vediamo un pò [...]]]></description>
			<content:encoded><![CDATA[<p>Questa volta <a href="http://eineki.wordpress.com">Eineki</a> ci propone un <a href="http://eineki.wordpress.com/2009/06/16/golf-programming-permutazioni/">quiz classico</a> che però presenta sempre interessanti spunti: le permutazioni.</p>
<p><span id="more-170"></span>Ecco la mia soluzione, sono 100 caratteri:</p>
<pre><code class="ruby">def k(l,n);l==''?n:l.split(//).map{|s|k(l.sub(s,''),n+s)}end;p k((ARGV[0]||"abcd"),'').flatten.uniq</code></pre>
<p>Per questa soluzione mi sono inspirato ad una bellissima funzione scritta in Erlang:</p>
<pre><code>permutation([]) -&gt; [[]];
permutation(L)  -&gt; [[H|T] || H &lt;- L, T &lt;- permutation(L--[H])].</code></pre>
<p>Vediamo un pò di orientarci con questa  particolare sintassi: Erlang utilizza dei pattern per descrivere quale &#8216;versione&#8217; della funzione utilizzare, in questo caso abbiamo due &#8216;permutation&#8217;, una che si attiva quando il parametro è una lista vuota e una quando non lo è.</p>
<p>Concentriamoci quindi sulla seconda riga:  il nome del costrutto che stiamo osservando si chiama &#8216;<a href="http://en.wikipedia.org/wiki/List_comprehension">List Comprehension</a>&#8216; ed il suo funzionamento è tutto basato nell&#8217;eseguire l&#8217;operazione a sinistra del doppio pipe &#8216;||&#8217; utilizzando i valori specificati nella parte destra.</p>
<p>Quindi nel nostro caso stiamo costruendo una lista di liste; notiamo infatti che a sinistra del doppio pipe risiede il costrutto classico di lista in Erlang:  [H|T]  ( H stà per Head e rappresenta il primo elemento della lista, T per tail e indica i rimanenti elementi della lista). Ma come vogliamo che sia costruita ognuna di queste liste ? La risposta è nella parte destra del List Comprehension:</p>
<ul>
<li>In H si alterneranno tutti gli elementi di L</li>
<li>In T, per ogni elemento di L, si alterneranno le liste derivanti dal calcolo delle permutazioni sulla lista L privata dell&#8217;elemento che è in H.</li>
</ul>
<p>In queste sede mi sono limitato ad una veloce overview sul funzionamento della funzione &#8216;permutation&#8217; in Erlang;  per chi intenedesse approfondire la tematica consiglio vivamente <a href="http://blogs.claritycon.com/blogs/peter_miller/archive/2007/10/14/3314.aspx">questo articolo</a> di <a href="http://www.linkedin.com/pub/peter-miller/7/a1/7b1">Peter Miller</a> che riesce a illustrare in modo molto comprensibile quanto io qui ho solo sommariamente spiegato.</p>
]]></content:encoded>
			<wfw:commentRss>http://sandropaganotti.com/2009/06/28/golf-programming-permutazioni/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

