<?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>Algoritmia básica (AB) &#187; Fibonacci</title>
	<atom:link href="http://webdiis.unizar.es/asignaturas/AB/?cat=45&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://webdiis.unizar.es/asignaturas/AB</link>
	<description>El reto de diseñar algoritmos eficientes para resolver problemas puede resultar apasionante</description>
	<lastBuildDate>Thu, 10 Feb 2022 08:44:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Fibonacci y programación dinámica</title>
		<link>http://webdiis.unizar.es/asignaturas/AB/?p=2141</link>
		<comments>http://webdiis.unizar.es/asignaturas/AB/?p=2141#comments</comments>
		<pubDate>Fri, 31 Mar 2017 11:02:18 +0000</pubDate>
		<dc:creator>Javier Campos</dc:creator>
				<category><![CDATA[cosas de clase]]></category>
		<category><![CDATA[Fibonacci]]></category>
		<category><![CDATA[programación dinámica]]></category>

		<guid isPermaLink="false">http://webdiis.unizar.es/asignaturas/AB/?p=2141</guid>
		<description><![CDATA[Uno de los ejemplos más sencillos (más que los vistos en clase) de aplicación de la programación dinámica es el cálculo del término n-ésimo de la sucesión de Fibonacci. La definición de la sucesión o función de Fibonacci es: Fib(n) = 1, si n = 0,1 Fib(n) = Fib(n-1) + Fib(n-2), si n &#62; 1 [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los ejemplos más sencillos (más que los vistos en clase) de aplicación de la programación dinámica es el cálculo del término <em>n</em>-ésimo de la sucesión de Fibonacci.</p>
<p>La definición de la sucesión o función de Fibonacci es:</p>
<p style="text-align: center;"><em>Fib</em>(<em>n</em>) = 1, si <em>n</em> = 0,1</p>
<p style="text-align: center;"><em>Fib</em>(<em>n</em>) = <em>Fib</em>(<em>n</em>-1) + <em>Fib</em>(<em>n</em>-2), si <em>n</em> &gt; 1</p>
<p>La solución más natural para calcular el término <em>n</em>-ésimo sería, por tanto, traducir esa definición recursiva de la función a nuestro pseudocódigo:</p>
<pre><strong>  función </strong>FibRec(n:natural) <strong>devuelve </strong>natural
<strong>  principio</strong>
    <strong>si </strong>n≤1 <strong>entonces</strong>
      <strong>devuelve </strong>1
    <strong>sino</strong>
      <strong>devuelve </strong>FibRec(n-1)+FibRec(n-2)
    <strong>fsi</strong>
<strong>  fin</strong></pre>
<p>El inconveniente de esa solución es su coste, exponencial en el valor de <em>n</em>. La ineficiencia de <em>FibRec</em> se debe a que se producen llamadas repetidas de la función para calcular valores que ya se habían calculado previamente, no se ha conservado su resultado, y por tanto hay que volver a calcularlos.</p>
<p>La solución de programación dinámica pasaría por utilizar una tabla auxiliar en la que almacenar las soluciones de todos los &#8220;subproblemas&#8221; (valores de <em>Fib</em> para valores menores que <em>n</em>) resueltos:</p>
<p style="text-align: center;"><a rel="attachment wp-att-2143" href="http://webdiis.unizar.es/asignaturas/AB/?attachment_id=2143"><img class="aligncenter size-full wp-image-2143" title="tabla" src="http://webdiis.unizar.es/asignaturas/AB/wp/wp-content/uploads/tabla1.jpg" alt="" width="272" height="28" /></a></p>
<p>El algoritmo iterativo para devolver el <em>n</em>-ésimo término de Fibonacci calculando la tabla sería:</p>
<pre>  <strong>función </strong>FibIterProto(n:natural) <strong>devuelve</strong> natural
<strong>  </strong><strong><strong>variables </strong></strong>i:natural; T:<strong>vector</strong>[0..n] <strong>de</strong> natural
<strong>  principio
</strong><strong>    si </strong>n≤1 <strong>entonces
</strong><strong>      devuelve</strong> 1
<strong>    sino
</strong>      T[0]:=1;
      T[1]:=1;
<strong>      para </strong>i:=2 <strong>hasta</strong> n <strong>hacer
</strong>        T[i]:=T[i-1]+T[i-2]
<strong>      fpara</strong>;
<strong>      devuelve</strong> T[n]
<strong>    fsi
</strong><strong>  fin </strong></pre>
<p>El último paso en la mejora proviene de detectar que en el algoritmo anterior no es necesario todo el vector auxiliar, pues basta con almacenar los dos últimos valores calculados:</p>
<pre>  <strong>función </strong>FibIter(n:natural) <strong>devuelve</strong> natural
<strong>  </strong><strong><strong>variables </strong></strong>i,suma,x,y:natural {x e y para almacenar los dos últimos
                 términos calculados y suma para almacenar el actual}
<strong>  principio
</strong><strong>    si </strong>n≤1 <strong>entonces
</strong><strong>      devuelve</strong> 1
<strong>    sino
</strong>      x:=1;
      y:=1;
<strong>      para </strong>i:=2 <strong>hasta</strong> n <strong>hacer
</strong>        suma:=x+y;
        y:=x;
        x:=suma
<strong>      fpara</strong>;
<strong>      devuelve</strong> suma
<strong>    fsi
</strong><strong>  fin </strong></pre>
]]></content:encoded>
			<wfw:commentRss>http://webdiis.unizar.es/asignaturas/AB/?feed=rss2&#038;p=2141</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
