<?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>Hyperreals *R &#187; Ciencia</title>
	<atom:link href="http://ch3m4.org/blog/category/ciencia/feed/" rel="self" type="application/rss+xml" />
	<link>http://ch3m4.org/blog</link>
	<description>quarks, bits y otras criaturas infinitesimales</description>
	<lastBuildDate>Sat, 12 May 2012 16:11:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Programación. ¿Ciencia o Ingeniería?</title>
		<link>http://ch3m4.org/blog/2012/03/09/programacion-ciencia-o-ingenieria-2/</link>
		<comments>http://ch3m4.org/blog/2012/03/09/programacion-ciencia-o-ingenieria-2/#comments</comments>
		<pubDate>Fri, 09 Mar 2012 21:21:32 +0000</pubDate>
		<dc:creator>Chema Cortés</dc:creator>
				<category><![CDATA[Ciencia]]></category>
		<category><![CDATA[Pensamientos]]></category>

		<guid isPermaLink="false">http://ch3m4.org/blog/?p=390</guid>
		<description><![CDATA[Cuando inicié este blog, además de servir de soporte a algunos artículos técnicos sobre programación que fueran más o menos novedosos, también me movió la idea de aportar reflexiones sobre algunos temas interdisciplinares que constantemente me hacía debido a mi formación científica y que he ido acumulando durante todos estos últimos años. Creo que es [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando inicié este blog, además de servir de soporte a algunos artículos técnicos sobre programación que fueran más o menos novedosos, también me movió la idea de aportar reflexiones sobre algunos temas <em>interdisciplinares</em> que constantemente me hacía debido a mi formación científica y que he ido acumulando durante todos estos últimos años. Creo que es momento de empezar con ellos&#8230;</p>

<h2>En busca de la materia gris</h2>

<p>Todavía persiste el mito de considerar que un informático es una especie de chamán que con unos cuantos pases mágicos delante de una pantalla es capaz de hacer que un ordenador tome vida. Muy pocos asumen que un informático pueda tener una formación científica o técnica seria que se encuentre al mismo nivel que un médico o un ingeniero. Y así nos van las cosas.</p>

<p>No tomarse en serio la formación de un informático está llevando a que muchas empresas del sector no valoren suficientemente la destreza de sus empleados. Asumen que siempre podrán encontrar nuevos empleados a los que poder darles una pequeña formación suficiente para encargarse de cualquier proyecto que tengan en marcha. Si supieran un mínimo de ingeniería, sabrían que siempre hay un límite en todo proyecto en el que añadiendo más recursos nunca se consigue acelerar el desarrollo, si no más bien lo contrario. Momentos de dificultad que desemboca en una crisis<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>, donde prima más la experiencia que la cantidad de manos disponibles.</p>

<p>La actual crisis económica ha venido a agravar más el panorama al minusvalorar aún más a los profesionales de informática. Los buenos profesionales optan por emigrar a otros países donde sean mejor considerados, mientras que aquí las empresas compiten bajando más y más los precios, sin tener en consideración ni la calidad ni la idoneidad del producto que desarrollan.</p>

<p>Estamos inmersos entre sistemas informáticos y de telecomunicaciones que se están colapsando debido a malos diseños y falta de mantenimiento, con usuarios que asumen por normal que un sistema pueda fallar, que los virus puedan entrar hasta las entrañas del ordenador, o que un <em>hacker</em> pueda bloquear cualquier sistema gubernamental y robar identidades,&#8230; y lo único que importa a los responsables es que alguna empresa sin escrúpulos asuma la culpa por el menor precio posible.</p>

<h2>El fin de la ley de Moore</h2>

<p>Es sabido que por la <a href="http://es.wikipedia.org/wiki/Ley_de_moore" title="Ley de Moore">Ley de Moore</a> en estos 50 años pasados, se estaba cumpliendo que cada dos años los ordenadores doblaban su velocidad, mientras se hacían cada vez más y más baratos. Como consecuencia, las aplicaciones mal diseñadas aún se podían sobrellevar gracias a la reducción de costes y mejoras de velocidad que ofrecían los nuevos sistemas.</p>

<p>Lamentablemente, la ley de Moore llega a su final. Se intenta prorrogar su vigencia metiendo más <em>cores</em> en cada cpu, pero si bien se sigue contando con procesadores más baratos y más rápidos, un sistema multicore no es aprovechable por una aplicación mal diseñada. Para aprovechar una cpu multicore, se requiere de nuevas aplicaciones diseñadas específicamente para ellos. Hoy en día, muchos sistemas operativos sólo son capaces de aprovechar un core de todos los disponibles, lo que no deja de ser un engaño para el usuario que piensa que debería ir todo más rápido. Estamos muy cerca de una nueva crisis similar a la crisis del software, pero con hardware esta vez.</p>

<p>Es una burbuja que pronto va a estallar como tantas otras antes.</p>

<h2>Poner en valor al programador</h2>

<p>Hace tiempo que se perdió el significado de ser un <strong>&#8220;programador&#8221;</strong>. Con ese nombre se ha pasado a denominar un puesto técnico de trabajo que está por debajo de analista y un poco por encima de reparador de hardware. Nada que tenga qué ver con un trabajo metodológico y, en cierta medida, creativo.</p>

<p>Y, sin embargo, contar con buenos programadores debería ser parte del activo de una empresa que la ponga en valor. No es entendible que haya empresas que busquen programadores después de haberse comprometido con un proyecto de desarrollo. Debería ser más bien al revés, que para conseguir un proyecto se haya valorado antes qué programadores dispone la empresa en nómina.</p>

<p>Puedo asegurar que hay alguna empresa que cuenta con un núcleo de buenos programadores, normalmente gente joven que montan su propia empresa, que nunca les falta trabajo. Pero son mucho más numerosas las empresas vacías que se dedican a quemar sistemáticamente a toda su plantilla en proyectos difíciles de asumir sin la gente y los medios adecuados.</p>

<p>Contar con programadores experimentados no es tarea fácil. Toda empresa debería asegurar a sus programadores más valiosos, nunca deberían considerarlos inferiores a analistas, ya que asumen roles distintos. Un buen programador puede ser un pésimo analista y viceversa. Un buen programador debería estar bien pagado simplemente como programador, y no verse presionado para ser analista si quiere ascender y cobrar más.</p>

<h2>Programación. ¿Ciencia o Ingeniería?</h2>

<p>Según donde busques, la programación es parte de la <em>Ciencia de la Computación</em> o es parte de la <em>Ingeniería del Software</em>. Personalmente, me inclino más por que sea una ciencia.  Un buen programador siempre intenta comprender el funcionamiento de un programa con el fin de crear nuevos y mejores programas. Usa un ciclo de análisis, desarrollo, prueba y refactorización que tanto se parece al <em>&#8220;método científico&#8221;</em>, experimentando hipótesis hasta dar con una solución. La ingeniería entraría cuando se requiere que la aplicación se ajuste a determinados requisitos, donde a veces no importa tanto la optimización del programa como el que se ajuste su funcionamiento a los parámetros requeridos.</p>

<p>¿Es posible buscar la belleza entre líneas de código? ¿Evolucionamos hacia mejores lenguajes de programación?</p>

<p>Temas para próximos artículos.</p>

<div class="footnotes">
<hr />
<ol>

<li id="fn:1">
<p>véase <a href="http://es.wikipedia.org/wiki/Crisis_del_software">Crisis del Software</a>&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>

</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://ch3m4.org/blog/2012/03/09/programacion-ciencia-o-ingenieria-2/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Estudio función factorial</title>
		<link>http://ch3m4.org/blog/2011/06/06/estudio-funcion-factorial/</link>
		<comments>http://ch3m4.org/blog/2011/06/06/estudio-funcion-factorial/#comments</comments>
		<pubDate>Mon, 06 Jun 2011 00:22:46 +0000</pubDate>
		<dc:creator>Chema Cortés</dc:creator>
				<category><![CDATA[Matemáticas]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[factorial]]></category>

		<guid isPermaLink="false">http://ch3m4.org/blog/?p=289</guid>
		<description><![CDATA[Hace un tiempo me dió por recopilar distintas funciones en python para calcular el factorial. Aquí van todas, algunas bastante curiosas. Si conoces algún tipo más, no dejes de añadirla en los comentarios. Versión recursiva Todo programador ha tenido que ver esta definición como ejemplo de funciones recursivas : def fact&#40;n&#41;: &#160; &#160; if n==0: [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un tiempo me dió por recopilar distintas funciones en python para calcular el <a href="http://es.wikipedia.org/wiki/Factorial">factorial</a>. Aquí van todas, algunas bastante curiosas. Si conoces algún tipo más, no dejes de añadirla en los comentarios.</p>

<h1>Versión recursiva</h1>

<p>Todo programador ha tenido que ver esta definición como ejemplo de funciones recursivas :</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">def</span> fact<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> n<span style="color: #66cc66;">==</span><span style="color: #ff4500;">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> n*fact<span style="color: black;">&#40;</span>n-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span></div></div>

<p>Se podría hacer algo más compacta usando el operador ternario:</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">def</span> fact<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">1</span> <span style="color: #ff7700;font-weight:bold;">if</span> n<span style="color: #66cc66;">==</span><span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">else</span> n*fact<span style="color: black;">&#40;</span>n-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span></div></div>

<p>Como toda función recursiva en python, existe el peligro de que nunca termine la función. Es el motivo por el que python tiene fijado un límite de recursividad dado por <code>sys.getrecursionlimit()</code>, que por defecto es de <code>1000</code> invocaciones recursivas o, lo que es lo mismo, que no podamos calcular factoriales mayores de 1000.</p>

<p>Podemos incrementar el límite con <code>sys.setrecursionlimit(n)</code>, pero seguirá siendo una solución provisional. Lo mejor es pasarnos a una solución <em>&#8220;iterativa&#8221;</em>.</p>

<h1>Versión iterativa</h1>

<p>También es una de la funciones más conocidas por todo programador:</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">def</span> fact<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; res<span style="color: #66cc66;">=</span><span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span>n+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; res*<span style="color: #66cc66;">=</span>n<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> res</div></div>

<p>Normalmente, todo lenguaje tiene un límite en el tamaño de un entero que hace que esta función no pueda calcular factoriales muy grandes. Pero python tiene la característica de pasar de <em>entero</em> a <em>entero largo</em> cuando así lo requiera la operación, lo que hace que se puede calcular cualquier número factorial, con el único límite de tiempo para calcularlo. Por lo general, con número grandes cuesta menos calcular el factorial que imprimirlos en pantalla.</p>

<h1>Versión aproximada (función de Stirling)</h1>

<p>Para número muy grandes, existe una aproximación llamada <a href="http://es.wikipedia.org/wiki/F%C3%B3rmula_de_Stirling">&#8220;Aproximación de Stirling&#8221;</a> que se suele usar en <em>mecánica estadística</em>.</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">math</span><br />
<span style="color: #ff7700;font-weight:bold;">def</span> fact<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">math</span>.<span style="color: black;">sqrt</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>*<span style="color: #dc143c;">math</span>.<span style="color: black;">pi</span>*n<span style="color: black;">&#41;</span>*<span style="color: #dc143c;">math</span>.<span style="color: #008000;">pow</span><span style="color: black;">&#40;</span>n/<span style="color: #dc143c;">math</span>.<span style="color: black;">e</span><span style="color: #66cc66;">,</span>n<span style="color: black;">&#41;</span></div></div>

<p>Lamentablemente, los números reales (tipo <code>double</code>) son aquí una limitación de tamaño, por lo que no podemos hacer cálculos para números altos (precisamente, para los que teóricamente iba mejor esta función).</p>

<h1>Versiones one-line</h1>

<p>Muchas veces, los programadores se toman como reto poder expresar una fórmula compleja en una sóla línea, de modo que se pueda sustituir la llamada a la función por la definición de esta directamente. Son las llamadas <em>funciones &#8220;oneline&#8221;</em>.</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">reduce</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> x<span style="color: #66cc66;">,</span>y:x*y<span style="color: #66cc66;">,</span><span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span>n+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span></div></div>

<p>Podemos aprovechar que tenemos el operador multiplicación y con ello evitar la función <code>lambda</code> (últimamente, en desuso):</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">operator</span><br />
<span style="color: #008000;">reduce</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">operator</span>.<span style="color: black;">mul</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span>n+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span></div></div>

<p>Algo más bizarro, evitando <code>lambda</code> y <code>reduce</code>:</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: black;">&#91;</span>j <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: #66cc66;">,</span>n+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span>j*i<span style="color: black;">&#93;</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span></div></div>

<p>Esta versión es en realidad un <em>&#8220;reduce sin usar reduce&#8221;</em>. Para entender cómo funciona, lo mejor es verlo como varios <code>fors</code> anidados:</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">def</span> fact<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: #66cc66;">,</span>n+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span>j*i<span style="color: black;">&#93;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">yield</span> j<br />
<br />
res<span style="color: #66cc66;">=</span><span style="color: #008000;">list</span><span style="color: black;">&#40;</span>fact<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span></div></div>

<p>El primer <code>for</code> tan sólo sirve para dar una valor inicial a la variable <code>j</code>, y el tercer <code>for</code> sería el equivalente <em>&#8220;oneline&#8221;</em> de <code>j=j*i</code>.</p>

<p>En realidad, esta función no está muy optimizada ya que mantiene en memoria la lista completa de todos los resultados intermedios. Un modo más inteligente de usar esta expresión sería como un iterador, donde los resultados intermedios ya no son almacenados:</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #ff7700;font-weight:bold;">for</span> res <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#40;</span>j <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: #66cc66;">,</span>n+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span>j*i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">pass</span></div></div>

<p>Aunque funciona perfectamente, no se puede considerar como función de una sóla línea. Para conseguirlo, tenemos que ir a algo totalmente críptico, incluyendo <code>reduce</code> y <code>lambda</code>, que acabaría siendo el siguiente engendro:</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">reduce</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> x<span style="color: #66cc66;">,</span>y:y<span style="color: #66cc66;">,</span><span style="color: black;">&#40;</span>j <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: #66cc66;">,</span>n+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span>j*i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></div></div>

<p><strong>Actualización:</strong>
Si queremos alguna solución sin <code>reduce</code> ni <code>lambda</code>, teniendo en cuenta que la función factorial es <em>incremental</em>, podemos emplear <code>max()</code> para obtener una versión con iterador de una sóla línea:</p>

<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">max</span><span style="color: black;">&#40;</span>j <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: #66cc66;">,</span>n+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span>j*i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></div></div>

<p>¿Se os ocurren otras formas de expresar el factorial en una sóla línea?</p>
]]></content:encoded>
			<wfw:commentRss>http://ch3m4.org/blog/2011/06/06/estudio-funcion-factorial/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>La paradoja de Monty Hall</title>
		<link>http://ch3m4.org/blog/2011/03/21/la-paradoja-de-monty-hall/</link>
		<comments>http://ch3m4.org/blog/2011/03/21/la-paradoja-de-monty-hall/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 17:31:10 +0000</pubDate>
		<dc:creator>Chema Cortés</dc:creator>
				<category><![CDATA[Matemáticas]]></category>

		<guid isPermaLink="false">http://ch3m4.org/blog/?p=86</guid>
		<description><![CDATA[Este fin de semana me plantearon el conocido como Problema de &#8220;Monty Hall&#8221;. Que me perdonen los matemáticos y estadísticos, pero no estoy de acuerdo con su planteamiento ni con sus conclusiones (antes de seguir, recomiendo una lectura del problema). Supongamos que el presentador actúa de la siguiente forma: cuando el concursante elige una puerta, [...]]]></description>
			<content:encoded><![CDATA[<p>Este fin de semana me plantearon el conocido como <a href="http://es.wikipedia.org/wiki/Problema_de_Monty_Hall">Problema de &#8220;Monty Hall&#8221;</a>. Que me perdonen los matemáticos y estadísticos, pero no estoy de acuerdo con su planteamiento ni con sus conclusiones (antes de seguir, recomiendo una lectura del problema).</p>

<p>Supongamos que el presentador actúa de la siguiente forma: cuando el concursante elige una puerta, se le permite optar entre quedarte con esa puerta o quedarse con el resto de puertas. Evidentemente, el concursante debería cambiar ya que la probabilidad aumenta cuanta más puertas tengas. Justamente, coincide con la solución probabilística que se da a este problema (2/3 de conseguir el coche) y es la razón por la que se debería cambiar siempre.</p>

<p>El error está en desconsiderar que cuando el presentador va abriendo (conscientemente) las puertas con cabra, la puerta elegida inicialmente también aumenta su probabilidad de tener un coche simplemente por el hecho de estar eliminando <em>elecciones</em> del planteamiento inicial, alcanzando el 50% cuando sólo quedan dos puertas (tal como nos indica nuestra intuición). Al eliminar puertas, estamos eliminando posibles fallos, lo que equivale a aumentar la posibilidad de que hayamos acertado en primera instancia. La decisión consciente del presentador está actuando sobre las condiciones iniciales del concurso y debe ser tenido en cuenta.</p>

<p>Pienso que este problema es confuso por el hecho de intentar aplicar métodos probabilísticos a un problema que no se rige enteramente por el azar. Si crees que estoy confundido, espero tus comentarios al respecto</p>
]]></content:encoded>
			<wfw:commentRss>http://ch3m4.org/blog/2011/03/21/la-paradoja-de-monty-hall/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

