<?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>Nullable Blog [Ignoranto.Info] &#187; Algoritmo</title>
	<atom:link href="http://ignoranto.info/tags/algoritmo/feed/" rel="self" type="application/rss+xml" />
	<link>http://ignoranto.info</link>
	<description>grbr.says(&#34;a little bit of everything and a lot of nothing&#34;);</description>
	<lastBuildDate>Sat, 24 Jul 2010 01:42:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Calculadora Recursiva en C#</title>
		<link>http://ignoranto.info/ricercando/calculadora-recursiva-en-csharp/</link>
		<comments>http://ignoranto.info/ricercando/calculadora-recursiva-en-csharp/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 20:39:45 +0000</pubDate>
		<dc:creator>gerWare</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Informática]]></category>
		<category><![CDATA[Recursividad]]></category>

		<guid isPermaLink="false">http://ignoranto.info/?p=572</guid>
		<description><![CDATA[Vamos a ver dos maneras de programar una simple calculadora: La primera: Una calculadora recursiva que Suma, Resta, Multiplica y Divide pero sin hacer uso de pilas de procesos (operaciones pendientes). La segunda: Una calculadora recursiva que solo Suma y Resta haciendo uso de operaciones pendientes (manteniendo una pila en espera). Primero&#8230; ¿Qué es la [...]]]></description>
			<content:encoded><![CDATA[<p>Vamos a ver dos maneras de programar una simple calculadora:</p>
<ul>
<li>La primera: Una calculadora recursiva que Suma, Resta, Multiplica y Divide pero sin hacer uso de pilas de procesos (operaciones pendientes).</li>
<li>La segunda: Una calculadora recursiva que solo Suma y Resta haciendo uso de operaciones pendientes (manteniendo una pila en espera).</li>
</ul>
<p>Primero&#8230;</p>
<h4 style="text-align: center;">¿Qué es la recursividad?</h4>
<p>Para saber que es la recursividad primero necesitamos saber que es la recursividad!</p>
<p>Una función o <strong>método recursivo</strong> es aquel que <strong>se invoca a si mismo</strong> (en alguna parte de su código éste hace llamado a si mismo) y depende de una condición propia para continuar invocándose o terminar el proceso y <strong>retornar un valor</strong>.</p>
<p>Ejemplo: Mostrar N numeros mayores a 0 de manera recursiva</p>
<pre>int algoRecursivo(int n)
{
  Console.WriteLine(n);
  if (n &gt; 0) { return algoRecursivo(n-1); }
  else { return 0; }
 }</pre>
<p>Con ello mostramos los números y preguntamos si N es mayor que 0, si se cumple esa condicion volvemos a llamar a la misma funcion pero le entregamos el valor de N-1, sino retornamos 0, y como 0 no es mayor que 0, la recursividad termina!</p>
<h4 style="text-align: center;">Calculadorita que&#8230; Suma, resta, multiplica y divide!</h4>
<p>Nuestra <strong>calculadora recursiva</strong>!</p>
<p>Éste método (función o procedimiento) recursivo (recurrente) recibe 1 parámetro para empezar su recurrencia y procesa de la siguiente manera&#8230;</p>
<ul>
<li>Se recibe un número entero &gt;&gt; N</li>
<li>Se pregunta por un operador de tipo char ( &#8216;+&#8217;, &#8216;*&#8217;, &#8216;-&#8217;, &#8216;/&#8217; ) &gt;&gt; OP</li>
<li>Si el operador ingresado es &#8216;=&#8217; el método devuelve el número recibido &gt;&gt; N</li>
<li>Sino, se pregunta por un número entero &gt;&gt; NU</li>
<li>Iniciamos un conmutador (switch) con la variable OP</li>
<li>Caso &#8216;+&#8217;, si OP es + entonces RESP será N+NU;</li>
<li>Caso &#8216;-&#8217;, si OP es &#8211; entonces RESP será N-NU;</li>
<li>Caso &#8216;*&#8217;, si OP es * entonces RESP será N*NU;</li>
<li>Caso &#8216;/&#8217;, si OP es /, si NU es diferente de 0, entonces RESP será N/NU; sino RESP será N y mostraremos error de división entre cero;</li>
<li>Fin del conmutador</li>
<li>Mostramos el resultado &gt;&gt; RESP</li>
<li>El método se llama a si mismo <strong>(recursividad)</strong> enviándose el resultado &gt;&gt; RESP</li>
</ul>
<p>La recursividad del método termina cuando el caracter ingresado es &#8216;=&#8217;, ya que <strong>retorna un valor</strong> y <strong>no hace recurrencia</strong> (no se vuelve a llamar a si mismo), el código del método es el siguiente:</p>
<pre>static int calc(int n)
{
 int resp = 0;
 Console.Write("Operador &gt; ");
 char op = char.Parse(Console.ReadLine());
 if (op == '=') return n;
 else
 {
   Console.Write("Numero  -&gt; ");
   int nu = int.Parse(Console.ReadLine());
   switch (op)
   {
      case '+': resp = n + nu; break;
      case '-': resp = n - nu; break;
      case '*': resp = n * nu; break;
      case '/': if (nu != 0) { resp = n / nu; }
                else { errorCero(); resp = n; };
                break;
      default: Console.WriteLine("Operador desconocido"); resp = n; break;
   }
   Console.WriteLine("Respuesta: {0}", resp);
   Console.Beep(1760, 200);
   return calc(resp);
 }
}</pre>
<p>El método errorCero(); no retorna ningun valor pero si muestra &#8220;un error&#8221; demasiado llamativo <img src='http://ignoranto.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , llamamos a éste metodo cuando se produce una división entre 0!</p>
<p>Podemos encontrar todo el código listo para compilar en ésta direccion &gt;&gt; <a href="http://develop.ignoranto.info/csharp/calculadoraRecursiva.cs">Calculadora Recursiva C#</a>; necesitamos Visual Studio, MonoDevelop o algun compilador de C# para poder compilar el código!</p>
<h4 style="text-align: center;">Calculadorita con uso de Stack (operaciones pendientes)</h4>
<p>Otra forma de hacer una <strong>calculadora recursiva </strong>es<strong> </strong>mediante <strong>stack</strong> (pilas de operaciones pendientes), de esta forma la calculadora solo funcionaría correctamente con Suma y Resta, ya que si mantenemos en stack la multiplicacion y división los resultados no serían los esperados (ya que operaría de atras hacia delante y no como debería ser), el algoritmo recursivo es el siguiente:</p>
<pre>static int recur(int n)
{
  Console.Write("OP: ");
  char oo = char.Parse(Console.ReadLine());
  if (oo == '=') { return n; }
  else
  {
    Console.Write("N : ");
    int nn = int.Parse(Console.ReadLine());
    switch (oo)
    {
     case '+': return n + recur(nn);
     case '-': return n - recur(nn);
     default:
       Console.WriteLine("Esta calculadora solo Suma y Resta");
       return recur(n);
    }
  }
}</pre>
<p>Con este otro algoritmo recursivo mantenemos &#8220;en espera&#8221; el resultado de <span style="text-decoration: underline;">recur(nn)</span>, cuando <span style="text-decoration: underline;">recur(nn)</span> devuelva un valor, recién operaremos dicho resultado. Si aplicamos esta recursión con operaciones de multiplicación y división, dichas operaciones se ejecutarian en orden inverso <img src='http://ignoranto.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  y los resultados no serían verídicos!</p>
<p>Puedes conseguir este otro código listo para compilar aquí &gt; <a href="http://develop.ignoranto.info/csharp/calculadoraRecursivaStack.cs">Otra Calculadora Recursiva</a></p>
<p><strong>Importante:</strong> Estas NO SON las únicas forma de hacer calculadoras recursivas, existen muchas formas <img src='http://ignoranto.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  el problema es descubrirlas <img src='http://ignoranto.info/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://ignoranto.info/ricercando/calculadora-recursiva-en-csharp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Buscar paréntesis () con PHP!</title>
		<link>http://ignoranto.info/ricercando/buscar-parentesis-con-php/</link>
		<comments>http://ignoranto.info/ricercando/buscar-parentesis-con-php/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 18:22:51 +0000</pubDate>
		<dc:creator>gerWare</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Funciones]]></category>

		<guid isPermaLink="false">http://codigo.ignoranto.info/?p=84</guid>
		<description><![CDATA[Si tuvieras esta expresión: 1+(4*(7-2)) ¿Cómo harías para extraer los valores de los últimos parentesis? No es muy dificil, primero necesitamos saber la ULTIMA posición del ULTIMO parentesis de APERTURA! » &#8221; ( &#8221; y luego saber la PRIMERA posición del PRIMER paréntesis de CIERRE! » &#8221; ) &#8220;; Y &#8230; ¿Cómo lo hago? En [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;"><strong>Si tuvieras esta expresión:</strong></p>
<h2 style="text-align: center;"><strong>1+(4*(7-2))</strong></h2>
<p style="text-align: left;"><strong>¿Cómo harías para extraer los valores de los últimos parentesis?<br />
</strong>No es muy dificil, primero necesitamos saber la ULTIMA posición del ULTIMO parentesis de APERTURA! » &#8221; ( &#8221; y luego saber la PRIMERA posición del PRIMER paréntesis de CIERRE! » &#8221; ) &#8220;;</p>
<p style="text-align: left;"><strong>Y &#8230; ¿Cómo lo hago?</strong><br />
En PHP tenemos la función STRPOS que nos devuelve la posición de cualquier caracter que busquemos dentro de una cadena de texto. Tenemos también STRRPOS (nótese de una R adicional) que nos devuelve la última posición de un caracter en particular!</p>
<pre style="text-align: left;">// ejemplo
$txt =
 "a(b(c))";
//0123456 las posiciones del texto!
echo $p01 = strpos ( $txt, ")" ); // nos devuelve 5
echo $p02 = strrpos( $txt, "(" ); // nos devuelve 3</pre>
<p>Con el ejemplo anterior hacemos que PHP nos muestre la posición de los parentesis () que están dentro de los otros parentesis ()!</p>
<p>Ahora extraeremos el contenido de dichos paréntesis!</p>
<pre>// ejemplo
$txt =
 "a(b(c))";
//0123456 las posiciones del texto!
echo $p01 = strpos ( $txt, ")" ); // nos devuelve 5
echo $p02 = strrpos( $txt, "(" ); // nos devuelve 3
// substr (texto, posicion, ncaracteres)
// $p02 - $p01 nos da la longitud de cadena a extraer!
// $p02 es 3, entonces comenzará a extraer desde la pos 3
// $p01 es 5, pero solo queremos 1 caracter!
echo substr ( $txt, $p02 , $p01-$p02);
// para solo extraer la letra C, seria asi:
echo substr ( $txt, $p02+1 , $p01-$p02-1);</pre>
<p>Eso es todo! ahora a probar! Como es sabido, todo esto se encuentra <a href="http://develop.ignoranto.info/php/buscarparentesis.php" target="_blank">aquí</a>; lamentablemente por ahora no encuentro la manera de descargar el código PHP, pronto implementaré algun script para poder descargar el código PHP contenido en <a href="http://develop.ignoranto.info" target="_blank">develop.ignoranto.info</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://ignoranto.info/ricercando/buscar-parentesis-con-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Problema de Syracuse (Conjetura de Collatz)</title>
		<link>http://ignoranto.info/ricercando/problema-de-syracuse/</link>
		<comments>http://ignoranto.info/ricercando/problema-de-syracuse/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 04:07:54 +0000</pubDate>
		<dc:creator>gerWare</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Conjetura de Collatz]]></category>
		<category><![CDATA[Métodos]]></category>
		<category><![CDATA[Problema de Syracuse]]></category>
		<category><![CDATA[Recursividad]]></category>

		<guid isPermaLink="false">http://codigo.ignoranto.info/?p=70</guid>
		<description><![CDATA[Hola, en este artículo vamos a ejemplificar y aplicar la recursividad de la conjetura de Collatz, si necesitas información matemática puedes recurrir a la wikipedia, quien redacta este artículo es estudiante de Ingeniería de Sistemas (futuro programador). El problema Syracuse o Conjetura de Collatz es una función recursiva y las condiciones son las siguientes: Si [...]]]></description>
			<content:encoded><![CDATA[<p>Hola, en este artículo vamos a ejemplificar y aplicar la recursividad de la <strong>conjetura de Collatz</strong>, si necesitas información matemática puedes recurrir a la <a href="http://es.wikipedia.org/wiki/Conjetura_de_Collatz">wikipedia</a>, quien redacta este artículo es estudiante de Ingeniería de Sistemas (futuro programador).<span style="text-decoration: line-through;"><br />
</span></p>
<p>El problema Syracuse o Conjetura de Collatz es una función recursiva y las condiciones son las siguientes:</p>
<blockquote><p>Si N es par, lo dividimos [N/2];<br />
Si N es impar, lo multiplicamos por 3 y sumamos +1 [3N+1];</p></blockquote>
<p>Siendo N un numero entero positivo; es necesario que N sea un numero entero positivo ya que si fuese real (con coma decimal) nuestro ordenador no podría saber si es &#8220;par o impar&#8221; debido a que una de las formas de saber si un número es par o impar es mediante el &#8220;módulo&#8221; el cual halla el residuo de una división, si el residuo de N y 2 es 0, entonces N es par!.</p>
<p><strong>Comencemos:</strong><br />
Necesitamos crear una funcion recursiva, nuestra función se llamará syr(), el parámetro de entrada es una variable de tipo entero (por que si fuera double o float simplemente no existiría el módulo (residuo)), obviamente nuestra función syr() devuelve un valor entero!</p>
<p>Si N es 1, retornamos 1;<br />
Sino, Si el módulo (residuo) de N y 2 es 0, retornamos N/2;<br />
Sino, retornamos 3*N+1;</p>
<p>Veamos lo que pasa si N valiese 5:<br />
5 % 2 == 0 ?? NO!<br />
entonces &gt;&gt; n = 3*5 + 1, [n = 16];<br />
16% 2 == 0 ?? SI!<br />
entonces &gt;&gt; n = 16/2, [n = 8];<br />
8% 2 == 0?? SI!<br />
entonces &gt;&gt; n = 8/2, [n = 4];<br />
4 % 2 == 0?? SI!<br />
entonces &gt;&gt; n = 4/2, [n = 2];<br />
2%2 == 0?? SI!<br />
entonces &gt;&gt; n = 2/2. [n= 1]<br />
1 == 1?? SI!<br />
Fin de la secuencia, llegamos a 1!</p>
<p><strong>EN PHP sería de la siguiente manera:</strong></p>
<pre>syr($n)
{
  echo $n; //mostramos $n
  if ($n == 1) //si $n es 1, devolvemos 1
    return 1;
  else //sino ...
  {
    if ($n%2 == 0) // si es par
      return syr($n/2); // lo dividimos
    else //sino
      return syr(3*n+1); // multiplicamos por 3 y sumamos 1;
  }
}</pre>
<p><a href="http://develop.ignoranto.info" target="_blank">El código ignoranto</a> tiene el algoritmo escrito en <a href="http://develop.ignoranto.info/csharp/syracuse.cs">C#</a> y <a href="http://develop.ignoranto.info/LeerPHP?Carpeta=php&amp;Archivo=syracuse.php">PHP</a>; también podemos probar la <a href="http://develop.ignoranto.info/php/syracuse.php">Serie de Syracuse</a> solo con números enteros menores de 1e5 (sino se sobre carga el server)!</p>
]]></content:encoded>
			<wfw:commentRss>http://ignoranto.info/ricercando/problema-de-syracuse/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Algoritmo para caminar</title>
		<link>http://ignoranto.info/ricercando/algoritmo-para-caminar/</link>
		<comments>http://ignoranto.info/ricercando/algoritmo-para-caminar/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 15:58:17 +0000</pubDate>
		<dc:creator>gerWare</dc:creator>
				<category><![CDATA[Cosas Raras]]></category>
		<category><![CDATA[Algoritmo]]></category>
		<category><![CDATA[Caminar]]></category>

		<guid isPermaLink="false">http://codigo.ignoranto.info/?p=58</guid>
		<description><![CDATA[Hola! este post nada tiene que ver con &#8220;programacion en computadores&#8221; mas bien es un algoritmo para que una persona pueda caminar Caminar () { Mientras (direccion exista) {   si (pie izquierdo esta delante)   {   pie derecho avanzar;   }   sino   {   pie izquierdo avanzar;   } } } [...]]]></description>
			<content:encoded><![CDATA[<p>Hola! este post nada tiene que ver con &#8220;programacion en computadores&#8221; mas bien es un algoritmo para que una persona pueda caminar <img src='http://ignoranto.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre>Caminar ()
{
 Mientras (direccion exista)
 {
   si (pie izquierdo esta delante)
   {
     pie derecho avanzar;
   }
   sino
   {
      pie izquierdo avanzar;
   }
 }
}</pre>
<p>Con este algoritmo podemos avanzar siempre y cuando tengamos una dirección de destino!</p>
]]></content:encoded>
			<wfw:commentRss>http://ignoranto.info/ricercando/algoritmo-para-caminar/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
