<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://josuerom.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://josuerom.github.io/" rel="alternate" type="text/html" /><updated>2026-01-11T01:18:48+00:00</updated><id>https://josuerom.github.io/feed.xml</id><title type="html">Josué Romero</title><subtitle>Don&apos;t follow your dream, follow me!</subtitle><entry><title type="html">Blogs y sitios web interesantes sobre algoritmos y programación competitiva</title><link href="https://josuerom.github.io/platforms/" rel="alternate" type="text/html" title="Blogs y sitios web interesantes sobre algoritmos y programación competitiva" /><published>2023-06-03T00:00:00+00:00</published><updated>2023-06-03T00:00:00+00:00</updated><id>https://josuerom.github.io/platforms</id><content type="html" xml:base="https://josuerom.github.io/platforms/"><![CDATA[<p>Blogs y sitios web interesantes sobre algoritmos y programación competitiva</p>

<h2 id="1-sitios-web-para-práctica-y-competencias-en-línea">1. Sitios web para práctica y competencias en línea</h2>
<ul>
  <li><a href="https://vjudge.net/">Vjudge</a> - Un sitio para competencias en línea con la capacidad de combinar ejercicios de diferentes sitios de resolución de problemas en línea.</li>
  <li>SPOJ (<a href="http://vn.spoj.com">Tiếng Việt - VOJ / VNOI</a> , <a href="https://www.spoj.com/">Toàn cầu</a>) - Un sitio “sagrado” para resolver problemas en línea que todos los estudiantes de Informática deben conocer. Este sitio contiene una gran cantidad de ejercicios de diversas fuentes (incluyendo problemas de competencias nacionales pasadas) para que los estudiantes practiquen. Muchas leyendas de la programación competitiva de Vietnam se han originado en este sitio.</li>
  <li><a href="https://freecontest.xyz/home">Free Contest</a> - Como un sitio de concurso en línea gratuito creado por el Sr. [Nguyen Tien Trung Kien] (https://www.facebook.com/nttkien), los exámenes se realizan cada 2 semanas para los estudiantes.</li>
  <li><a href="https://codeforces.com/">Codeforces</a> - También es un sitio de lectura en línea que cualquier estudiante de noticias debe conocer. Este sitio web se centra en una gran cantidad de exámenes, se realizan ejercicios de calidad cada 2 o 3 semanas y hay soluciones después de cada examen. Codeforces también es un foro sobre algoritmos y tiene muchos buenos artículos y es una gran comunidad sobre programación competitiva en el mundo.</li>
  <li><a href="https://www.topcoder.com/">Topcoder</a> - Al igual que Codeforces, Topcoder también es un gran sitio de exámenes en línea con muchos ejercicios buenos y difíciles y exámenes SRM (Single Round Match) para que practiques.</li>
  <li><a href="https://www.hackerrank.com/">HackerRank</a> - Este sitio web es una plataforma de programación competitiva dirigida a usuarios generales y empresas. Los ejercicios aquí cubren una amplia variedad de problemas de informática y en diferentes lenguajes de programación.</li>
  <li><a href="https://open.kattis.com">Kattis</a> - Un sitio de examen en línea con fuentes de los períodos ACM-ICPC de los países y la final mundial de ICPC.</li>
  <li><a href="http://www.usaco.org/">USACO</a> - Sitio de examen en línea estadounidense, con ejercicios relacionados con la vaca BeSsiE :)))</li>
  <li><a href="http://www.hsin.hr/coci/">COCI</a> - Sitio abierto de examen en línea de Croacia.</li>
  <li><a href="https://uva.onlinejudge.org/">UVa</a> - Es un antiguo sitio de apuestas en línea. Debe usarlos con la página [Uhunt] (http://uhunt.onlinejudge.org/) y el libro <strong>Programación competitiva, 3ra edición</strong> para practicar.</li>
  <li><a href="http://acm.timus.ru/">Timus</a> - El sitio de lectura en línea más antiguo de Rusia, que presenta ejercicios de las competencias de la Universidad Federal de los Urales, como los Campeonatos de los Urales, los Concursos subregionales de Ural ACM ICPC y los Campos de entrenamiento de Petrozavodsk.</li>
  <li><a href="http://poj.org/">POJ</a> - Es un sitio de lectura en línea de la Universidad de Pekín (China) con muchos buenos ejercicios. Aquí es donde comenzaron muchos mitos sobre el PC chino.</li>
  <li><a href="https://szkopul.edu.pl/p/default/problemset_eng">SZKOpul</a> - Es un sitio de lectura en línea polaco.</li>
</ul>

<h2 id="2-buenos-sitios-webblogs-sobre-algoritmos">2. Buenos sitios web/blogs sobre algoritmos</h2>
<ul>
  <li><a href="vnoi.info/wiki/home">VNOI Wiki</a> - Como uno de los recursos CS/CP más completos de Vietnam.</li>
  <li><a href="https://thuytrangcoding.wordpress.com/">#Team4T’s Coding Site</a> - Página de algoritmos del #Team4T: Tran Thi Thuy Trang, Ngo Thi Ngoc Mai y Le Duy Bach.</li>
  <li><a href="http://www.giaithuatlaptrinh.com/?page_id=4">Giải Thuật Lập Trình</a> - Blog sobre algoritmos del Sr. Hung Le, Universidad de Victoria.</li>
  <li><a href="http://emaxx.ru">E-Maxx (RU)</a> - Página algorítmica (en ruso) (Puedes traducir en Google =))).</li>
  <li><a href="http://cp-algorithms.com/">E-Maxx (EN)</a> - Versión en inglés de E-Maxx.</li>
  <li><a href="https://www.topcoder.com/community/data-science/data-science-tutorials/">Topcoder Data Science Tutorial</a> - Serie de artículos sobre algoritmos y CP.</li>
  <li><a href="https://www.geeksforgeeks.org">GeeksforGeeks</a> - Un conocido sitio de programación competitivo, un recurso rico en algoritmos.</li>
  <li><a href="http://wcipeg.com/wiki/Main_Page">PEG-Wiki</a> - Woburn C.I. El sitio wiki de títulos de Woburn C.I. sobre una amplia variedad de temas. Grupo de Enriquecimiento de Programación (WCIPEG).</li>
  <li><a href="https://www.commonlounge.com/discussion/5d2822257dfa49328d85fd27cf114441/main?r=fbp&amp;p=cp">Competitive Programming: From Beginner to Expert - CommonLounge</a> Famoso sitio web de algoritmos</li>
  <li><a href="http://www.csie.ntnu.edu.tw/~u91029/">Algorithm Notes</a> - en la comunidad de CP de Taiwán (en chino) - Nuevamente, por favor Google traductor =))).</li>
  <li><a href="">CodeBabe</a> - Bueno, este es….. (° ͜ʖ ͡°) <code class="language-plaintext highlighter-rouge">googlealo tu mismo</code></li>
</ul>

<h2 id="25-buenas-entradas-de-blog-sobre-codeforces-sobre-algoritmos">2.5. Buenas entradas de blog sobre Codeforces sobre algoritmos</h2>
<ul>
  <li><a href="https://codeforces.com/blog/entry/23054?mobile=false&amp;locale=en">Codeforces - An awesome list for competitive programming!</a> - La entrada de blog de Codeforces-er <a href="https://codeforces.com/profile/lnishan">lnishan</a>, es uno de los recursos de algoritmos más completos y una de las fuentes en las que creé esta cosa = ))).</li>
  <li><a href="https://codeforces.com/blog/entry/57282">All of the good tutorials found on codeforces</a> - La entrada de blog de Codeforces-er <a href="https://codeforces.com/profile/Underdog_eagle">Underdog_eagle</a> - es una lista de excelentes tutoriales sobre Codeforces.</li>
  <li><a href="https://codeforces.com/blog/entry/13529">Good Blog Post Resources about Algorithm and Data Structures</a> - Entrada de blog de Codeforces-er <a href="https://codeforces.com/profile/Akin">Akin</a>: es una lista de artículos sobre algoritmos y CTDL en Codeforces.</li>
</ul>

<h2 id="3-sitios-web-sobre-bibliotecas-de-código-y-la-parte-que-pone-algoritmos-y-estructuras-de-datos">3. Sitios web sobre bibliotecas de código y la parte que pone algoritmos y estructuras de datos.</h2>
<ul>
  <li><a href="https://sites.google.com/site/kc97ble/">kc97ble</a> - Esta página contiene la configuración de algoritmos comunes creados por <a href="https://www.facebook.com/nttkien">Nguyen Tien Trung Kien</a>.
    * <a href="https://github.com/ngthanhtrung23/ACM_Notebook_new">ACM_Notebook_new</a> - Cuaderno del equipo de RRWatameda (Nguyen Thanh Trung(I_love_Hoang_Yen), Nguyen Nguyen(flashmt) y Nguyen Hung Tam) de la Universidad Nacional de Singapur para ACM-ICPC Final Mundial 2016.</li>
  <li><a href="https://github.com/duc0/ContestNeko">duc0/ContestNeko</a> - Biblioteca del Sr. Ngo Minh Duc, PTNK (?).</li>
  <li><a href="http://code-library.herokuapp.com/">CodeLibrary</a> - El algoritmo de Andrey Naumenko y la biblioteca CTDL (indy256), escritos en C++ y Java. Consulte su repositorio Git en [aquí] (https://github.com/indy256/codelibrary).</li>
  <li><a href="https://github.com/kth-competitive-programming/kactl">KATCL - KTH Algorithm Competition Template Library</a> - Cuaderno del equipo Equipo del CIPC del KTH Royal Institute of Technology, Estocolmo, Suecia. Los algoritmos están completamente instalados y probados.</li>
  <li><a href="https://github.com/jaehyunp/stanfordacm">Stanford ACM-ICPC</a> - Cuaderno del equipo Equipo del CIPC de la Universidad de Stanford.</li>
  <li><a href="https://codeforces.com/blog/entry/22072">Heavy-light decomposition implementation</a> - Una buena implementación para el método Codeforces-er <a href="https://vnoi.info/wiki/algo/data-structures/heavy-light-decomposition">AI.Cash</a> de Codeforces-er <a href="https:/ / codeforces.com/profile/Al.Cash">AI.Cash</a>.</li>
</ul>

<h2 id="4-sitios-web-sobre-soluciones-a-algunos-ejercicios-en-plataformas-de-resolución-de-problemas-en-línea">4. Sitios web sobre soluciones a algunos ejercicios en plataformas de resolución de problemas en línea</h2>
<ul>
  <li><a href="http://vnoi.info/problems/list/">VNOI</a> - Este sitio web era originalmente un foro de CP Vietnam, pero ahora la sección del foro se ha trasladado al [grupo de Facebook VNOI] (https://www.facebook.com/groups/VNOIForum/) y este sitio ahora alberga problemas y soluciones para más de 500 ejercicios sobre VNOI (SPOJ Vietnam).</li>
  <li><a href="https://traitaodo.wordpress.com/">Trái táo đỏ</a> - Tu blog es Nguyen Le Duy.
    * <a href="https://doraemonvodanh.wordpress.com/">Doraemonvodanh</a> - El blog de alguien también trata sobre algoritmos.</li>
  <li><a href="https://vietcodes.github.io/">VietCodes</a> - Además de las soluciones y el código de muestra para los ejercicios, el sitio también incluye artículos sobre algoritmos comunes e implementaciones en C++, Python 3 y Rust.</li>
  <li><a href="https://cowboycoder.tech/">Cowboy Coder</a> - Este sitio no solo proporciona soluciones para ejercicios buenos y difíciles en línea, sino también una serie de conocimientos de programación y experiencias en la industria.</li>
</ul>

<h2 id="5-sobre-trucos-relacionados-con-lenguajes-de-programación">5. Sobre trucos relacionados con lenguajes de programación</h2>
<ul>
  <li><a href="https://codeforces.com/blog/entry/15643">C++ Tricks</a> - Entrada de blog de Codeforces-er <a href="https://codeforces.com/profile/Swift">Swift</a> sobre trucos con C++ en programación competitiva.</li>
  <li><a href="https://codeforces.com/blog/entry/11080">C++ STL: Policy based data structures - Part 1</a>, <a href="http://codeforces.com/blog/entry/13279">Part 2</a> - Entrada de blog de Codeforces-er <a href="https://codeforces.com/profile/adamant">adamant</a> sobre estructuras de datos integradas personalizadas en C++, específicamente Trie y Ordered Set.</li>
</ul>

<h2 id="6-herramientas-útiles-para-ti">6. Herramientas útiles para ti</h2>
<ul>
  <li><a href="https://visualgo.net/vi">VisuAlgo</a> - La herramienta ayuda a simular algoritmos y estructuras de datos a través de la animación.</li>
  <li><a href="http://whocouldthat.be/visualizing-string-matching/">String Matching Visualization</a> - Simulación de algunos algoritmos de coincidencia de cadenas bien conocidos.</li>
  <li><a href="https://csacademy.com/app/graph_editor/">Graph Editor - CSAcademy</a> - Una herramienta de CSAcademy que admite gráficos.</li>
  <li>
    <table>
      <tbody>
        <tr>
          <td>[Wolfram</td>
          <td>Alpha](https://wolframalpha.com) - Kit de herramientas para el procesamiento del lenguaje natural, encuesta de funciones…</td>
        </tr>
      </tbody>
    </table>
  </li>
  <li><a href="https://www.hackerrank.com/calendar">HackerRank Contest Calendar</a> - El calendario de exámenes ha sido, es, tendrá lugar en todas las plataformas de examen de programación en línea.</li>
  <li><a href="https://open.spotify.com">Spotify</a> - solo para escuchar musica 😂</li>
</ul>

<h2 id="7-software-e-interfaces-web">7. Software e interfaces web</h2>
<ul>
  <li><a href="https://dsapblog.wordpress.com/2013/12/24/themis/">Themis</a> - Programa de calificación automática, creado por el Sr. Le Minh Hoang y el Sr. Do Duc Dong.
    * [Interfaz de Themis 1] (http://www.mediafire.com/file/s8as1dtbqas7cxj/JUDGER.zip): una interfaz de sitio web de calificación en línea que usa Themis escrita por el maestro Nguyen Hoang Phu (Ly Tu Trong High School, Can Tho) , que complementa la transcripción del Sr. Nguyen Van Hieu (escuela secundaria para superdotados Hung Yen). Se puede usar para Windows de 32 y 64 bits, pero la interfaz no es tan hermosa como la versión TWI del Sr. Pham Cao Nguyen.
    * <a href="https://github.com/natsukagami/themis-web-interface/releases">Interfaz de Themis 2 - Natsu Kagami</a> - La interfaz del sitio web de calificación en línea usando Themis escrito por el Sr. Pham Cao Nguyen. <strong>Solo para versiones de Windows de 64 bits.</strong></li>
</ul>

<p><em>(continuará, aún no ha terminado :wink:)</em></p>

<h2 id="contribuidor--bu1th4nh">Contribuidor : <a href="https://github.com/CTB-informatics-team/open-library-of-cs/">bu1th4nh</a></h2>]]></content><author><name></name></author><category term="bu1th4nh" /><summary type="html"><![CDATA[Author : josuerom]]></summary></entry><entry><title type="html">Ramanujan</title><link href="https://josuerom.github.io/ramanujan/" rel="alternate" type="text/html" title="Ramanujan" /><published>2023-06-03T00:00:00+00:00</published><updated>2023-06-03T00:00:00+00:00</updated><id>https://josuerom.github.io/ramanujan</id><content type="html" xml:base="https://josuerom.github.io/ramanujan/"><![CDATA[<h3 id="ramanujan-total-1--2--3-------112">RAMANUJAN TOTAL: 1 + 2 + 3 + ⋯ + ∞ = -1/12?</h3>
<h4 id="marcos-dodds">Marcos Dodds</h4>
<p>=========</p>
<blockquote>
  <p>“¿De qué diablos estás hablando? ¡Esto no puede estar bien!” - Mi madre</p>
</blockquote>

<p>Lo dijo cuando le hablé de esta extraña ecuación matemática. Y simplemente, es una ecuación irregular. Realmente, convirtió la lógica básica en una farsa. ¿Cómo es que cuando sumamos números enteros positivos, obtenemos no solo un número negativo, sino también una fracción negativa? ¿Cuál es esa fracción?
Antes de continuar: Cuando me hablaron de esto, se dijo que en ese momento la palabra ‘total’ ya no tenía sentido común. Como todas las series de números con las que me encuentro no suelen converger en un número concreto, hablaremos de otro tipo de suma, la Suma de Cesàro. Además para cualquier interesado en las matemáticas, la suma de Cesàro asignará valores a algunas series de números que no convergen en el sentido habitual. “La suma de Cesàro se define como el límite de la media aritmética de las primeras n sumas parciales de una serie cuando n tiende a infinito” — Wikipedia. También me gustaría decir que a lo largo de este artículo solo usaré el concepto de infinito contable, que es un tipo de infinito que involucra un conjunto infinito de números finitos que, dado el tiempo suficiente, podrías contar hasta cualquier número en ese conjunto. . Esto me permite usar algunas de las propiedades habituales de las matemáticas en mis ecuaciones, como la conmutatividad (que usaré a lo largo del artículo).
Si eres nuevo en la serie de números llamada Ramanujan Sum, lleva el nombre de un famoso matemático indio, Srinivasa Ramanujan. Esta suma muestra que si sumamos todos los números naturales, 1, 2, 3, 4, etc., hasta el infinito, obtenemos -1/12. Halo, -0.083333333333 ahí.</p>
<blockquote>
  <p>(-1) = 1 + 2 + 3 + 4 + ….. = -1/12</p>
</blockquote>

<p>¿No me crees? Sigue leyendo para ver cómo lo hago, probaré dos proposiciones igualmente locas:</p>
<blockquote>
  <ol>
    <li>1 – 1 + 1 – 1 + 1 – 1 = 1/2</li>
  </ol>
</blockquote>

<blockquote>
  <ol>
    <li>1 – 2 + 3 – 4 + 5 – 6 = 1/4</li>
  </ol>
</blockquote>

<p>Primero, tienes que estar preparado. El verdadero milagro está por suceder, de hecho no podemos probar las otras dos proposiciones sin este párrafo.
Comenzaré con una secuencia de números A, igual a 1 – 1 + 1 – 1 + 1 – 1 repetido un número infinito de veces. Lo escribo como:</p>
<blockquote>
  <p>UN = 1 – 1 + 1 – 1 + 1 – 1⋯</p>
</blockquote>

<p>Y haz un poco de técnica. Tomemos 1 menos A</p>
<blockquote>
  <p>1 – A = 1 - (1 – 1 + 1 – 1 + 1 – 1⋯)</p>
</blockquote>

<p>Todo salió muy bien, ¿no? Y aquí está el clímax. Si reduzco el lado derecho de la ecuación, obtengo algo realmente genial:</p>
<blockquote>
  <p>1 – UN = 1 – 1 + 1 – 1 + 1 – 1 + 1⋯</p>
</blockquote>

<p>¿Te parece familiar? Si ya lo has olvidado, esa es la A. Bueno, el lado derecho de la ecuación es la serie de números que teníamos inicialmente. Así que puedo reemplazar el lado derecho con A y hacer un poco de álgebra de secundaria simple y luego ¡bum!</p>
<blockquote>
  <p>1 - A = A</p>
</blockquote>

<blockquote>
  <p>1 – A + A = A + A</p>
</blockquote>

<blockquote>
  <p>1 = 2A</p>
</blockquote>

<blockquote>
  <p>1/2 = A</p>
</blockquote>

<p>Esta bonita ecuación es la serie Grandi, llamada así por el matemático, filósofo y sacerdote italiano Guido Grandi. Ese es todo el contenido de esta serie, me encanta, aunque no hay una historia genial o historias interesantes detrás. Sin embargo, nos abrió la puerta para probar muchas otras cosas fascinantes, incluida una ecuación importante en la mecánica cuántica e incluso en la teoría de cuerdas. Pero eso es para más adelante. Ahora bien, demostremos 2 más: 1 – 2 + 3 – 4 + 5 – 6⋯ = 1/4.
Comenzando como arriba de mí, he establecido la serie B = 1 – 2 + 3 – 4 + 5 – 6⋯. Y ahora podemos empezar a jugar un poco. Esta vez, en lugar de restar B de 1, restaremos A menos B y obtendremos:</p>
<blockquote>
  <p>A - B = (1 – 1 + 1 – 1 + 1 – 1⋯) — (1 – 2 + 3 – 4 + 5 – 6 )</p>
</blockquote>

<blockquote>
  <p>A - B = (1 – 1 + 1 – 1 + 1 – 1⋯) — 1 + 2 – 3 + 4 – 5 + 6⋯</p>
</blockquote>

<p>Cambiaremos un poco los términos y veremos surgir muchas reglas interesantes.</p>
<blockquote>
  <p>A - B = (1 – 1) + (–1 + 2) + (1 – 3) + (–1 + 4) + (1 – 5) + (–1 + 6)⋯</p>
</blockquote>

<blockquote>
  <p>A - B = 0 + 1 – 2 + 3 – 4 + 5⋯</p>
</blockquote>

<p>Y de nuevo, tenemos la secuencia con la que empezamos, y encima de eso, hemos probado A = 1/2, así que usamos un poco más de álgebra básica y obtenemos la paridad Esta segunda sorpresa.</p>
<blockquote>
  <p>A - B = B</p>
</blockquote>

<blockquote>
  <p>A = 2B</p>
</blockquote>

<blockquote>
  <p>1/2 = 2B</p>
</blockquote>

<blockquote>
  <p>1/4 = SOBRE</p>
</blockquote>

<p>¡Oh, no! Esta ecuación no tiene un nombre elegante, como muchos matemáticos han demostrado a lo largo de los años, siempre se ha considerado una paradoja matemática. Hubo un acalorado debate académico en ese momento con respecto a esta ecuación, aunque contribuyó a la extensión del trabajo de Euler sobre el problema de Basilea y la creación de funciones importantes como la función Zeta Reimann.
Ahora llega la sublimación que estabas esperando. Volvemos a poner la serie C = 1 + 2 + 3 + 4 + 5 + 6⋯ y, como puedes adivinar, le restamos C a B.</p>
<blockquote>
  <p>segundo - do = (1 – 2 + 3 – 4 + 5 – 6⋯) - (1 + 2 + 3 + 4 + 5 + 6⋯)</p>
</blockquote>

<p>Y las matemáticas aún no han terminado, vamos a reorganizar algunos términos para crear algo familiar, pero tal vez no sea lo que espera.</p>
<blockquote>
  <p>segundo - do = (1 - 2 + 3 - 4 + 5 - 6⋯) - 1 - 2 - 3 - 4 - 5 - 6⋯</p>
</blockquote>

<blockquote>
  <p>B - C = (1 - 1) + (-2 - 2) + (3 - 3) + (-4 - 4) + (5 - 5) + (-6 - 6)</p>
</blockquote>

<blockquote>
  <p>B - C = 0 - 4 + 0 - 8 +</p>
</blockquote>]]></content><author><name></name></author><summary type="html"><![CDATA[RAMANUJAN TOTAL: 1 + 2 + 3 + ⋯ + ∞ = -1/12? Marcos Dodds ========= “¿De qué diablos estás hablando? ¡Esto no puede estar bien!” - Mi madre]]></summary></entry><entry><title type="html">Parte 1: ¿Qué es la recursividad?</title><link href="https://josuerom.github.io/recursion-1/" rel="alternate" type="text/html" title="Parte 1: ¿Qué es la recursividad?" /><published>2023-06-03T00:00:00+00:00</published><updated>2023-06-03T00:00:00+00:00</updated><id>https://josuerom.github.io/recursion-1</id><content type="html" xml:base="https://josuerom.github.io/recursion-1/"><![CDATA[<p><a href="https://www.facebook.com/ptl8210/posts/2234000946833871" target="_blank"><img src="https://scontent.fhph1-2.fna.fbcdn.net/v/t1.0-9/61622081_2393975730836391_4739488860583493632_n.jpg?_nc_cat=103&amp;_nc_oc=AQm6Lcf9EqU_otXzUHz5qmiWwYD3Vc7RszWrOfnXnIAF1vnDPFXT96J1LePTwfipecbrPsdY1ZxTUhqhTB083sNO&amp;_nc_ht=scontent.fhph1-2.fna&amp;oh=c0a48d65a9df0022b9dc4e232a91092c&amp;oe=5D52A7EF" alt="enl" /></a></p>

<p><em>Hola chicos, como estoy un poco aburrido estos días, les escribiré un tutorial para que no estén tristes :&lt; ¡Comencemos!</em></p>

<h2 id="1-el-concepto-de-recursividad">1. El concepto de recursividad</h2>
<blockquote>
  <p>Para entender la recursividad, primero hay que entender la recursividad.</p>
</blockquote>

<p>El concepto de <strong>recursión</strong> es difícil de entender para un programador al principio, ¡así que veamos algunos ejemplos concretos antes de entrar en su concepto completo!</p>

<blockquote>
  <p><em>Supongamos que vas al dormitorio a cambiarte de ropa, rápido para llegar a tiempo al trabajo. Pero encuentras la habitación cerrada con llave y sabes que tu hijo de 3 años los esconde en una caja. Al abrir la caja, verá que incluye muchas otras subcajas que en su interior incluyen muchas cajas más pequeñas. Está confundido y necesita encontrar una solución rápidamente para no llegar tarde al trabajo</em></p>
</blockquote>

<p><img src="https://cdn-images-1.medium.com/max/800/1*FVSUmSQEEsagXaKa_ajtvA.png" alt="Ejemplo" /></p>

<ul>
  <li>Para manejar este problema, tenemos 2 enfoques: “<strong>bucle</strong>” <em>(bucle)</em> y “<strong>recursión</strong>” <em>(recursión)</em> para crear un algoritmo.</li>
</ul>

<p><img src="https://cdn-images-1.medium.com/max/800/1*QrQ5uFKIhK3jQSFYeRBIRg.png" alt="Iteración y recursividad" /></p>

<ul>
  <li>En el primer enfoque usamos un bucle. Hasta que se acabe la caja, sacará 1 caja de la pila de cajas y la abrirá.
    <ul>
      <li><strong>Caso 1</strong> : Si encuentras la llave :v ¡Felicitaciones por tu éxito!</li>
      <li><strong>Caso 2</strong> : ¡Pero si no tienes suerte, encuentras otras cajas, ponlas en la pila de cajas y haz lo mismo!</li>
    </ul>
  </li>
</ul>

<blockquote>
  <p><em>Lo demostraré en pseudocódigo C++ como este, usando una cola para almacenar un montón de cajas</em>:</p>
</blockquote>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">look_for_key</span><span class="p">()</span>
<span class="p">{</span>
    <span class="kt">bool</span> <span class="n">ok</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
    <span class="n">queue</span> <span class="o">&lt;</span> <span class="n">box</span> <span class="o">&gt;</span> <span class="n">pile</span><span class="p">;</span>
    <span class="n">pile</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">main_box</span><span class="p">);</span>
    <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">pile</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span>
    <span class="p">{</span>
        <span class="n">box</span> <span class="k">this</span> <span class="o">=</span> <span class="n">pile</span><span class="p">.</span><span class="n">front</span><span class="p">();</span>
        <span class="n">pile</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
        <span class="k">for</span><span class="p">(</span><span class="n">item_in_this</span><span class="p">)</span>
            <span class="k">if</span><span class="p">(</span><span class="n">is_a_key</span><span class="p">(</span><span class="n">item</span><span class="p">))</span><span class="n">ok</span> <span class="o">=</span><span class="nb">true</span><span class="p">,</span><span class="k">break</span><span class="p">;</span>
            <span class="k">else</span> <span class="c1">// item is a box</span>
                <span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">item</span><span class="p">);</span>
        <span class="k">if</span><span class="p">(</span><span class="n">ok</span><span class="p">)</span>  <span class="k">break</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<ul>
  <li>Segundo enfoque, usaremos <strong>recursión</strong>. Recuerda siempre que la recursividad es una función que se llama a sí misma.</li>
</ul>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// init ok = false;</span>
<span class="kt">void</span> <span class="nf">look_for_key</span><span class="p">(</span><span class="n">box</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span><span class="p">(</span><span class="n">ok</span><span class="p">)</span>
        <span class="k">break</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="n">item_in_this</span><span class="p">)</span>
        <span class="k">if</span><span class="p">(</span><span class="n">is_a_key</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
            <span class="n">ok</span> <span class="o">=</span><span class="nb">true</span><span class="p">,</span> <span class="k">break</span><span class="p">;</span>
        <span class="k">else</span> <span class="c1">// item is a box</span>
            <span class="n">look_for_key</span><span class="p">(</span><span class="n">item</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<blockquote>
  <p><strong><em>Análisis</em></strong> : Veo que abriré la caja, si encuentro la llave, ¡por supuesto que está hecho! Y si vemos la caja, ¡realizaremos las mismas operaciones que cuando abrimos la caja original!</p>
</blockquote>

<h4 id="a-través-del-ejemplo-anterior-puedes-imaginar-un-poco-qué-es-la-recursividad">A través del ejemplo anterior, ¡puedes imaginar un poco qué es la recursividad!</h4>

<blockquote>
  <p><strong>Recursión</strong> es un método usado en un programa de computadora que usa una función de devolución de llamada.</p>
</blockquote>

<p><img src="https://media.giphy.com/media/39t0oKaT84gHgM2E63/giphy.gif" alt="Ejemplo de recursión" /></p>

<h2 id="2-mecanismo-de-recursividad-en-informática">2. Mecanismo de recursividad en informática</h2>

<p>El ejemplo anterior puede hacerte pensar que la <strong>recursión</strong> es confusa, no simple y te frustra :&lt; Haz tu mejor esfuerzo porque muchos algoritmos usan <strong>recursión</strong> en informática. Veremos cómo funciona la <strong>recursión</strong>, que es el mecanismo de <strong>apilado</strong> al llamar funciones</p>

<blockquote>
  <p><em>“En <strong>informática</strong>, una pila (también llamada apilador, en inglés: <strong>stack</strong>) es una estructura de datos abstracta que opera según el principio de “último en entrar, último en salir” antes de” (Last In Primero en salir (LIFO)”</em> - Wikipedia.</p>
</blockquote>

<ul>
  <li><strong>Recursión</strong> a menudo usa el mecanismo de pila <strong>LIFO</strong>: último en entrar y salir antes de llamar a las funciones.</li>
  <li>Cuando se llama a una función recursiva más tarde, se coloca en la parte superior de la pila. Imagina que tienes una pila de libros, cuando pones o quitas un libro, siempre priorizas el libro de arriba.</li>
</ul>

<p><img src="https://visualgo.net/img/stack_illustration.png" alt="pila" /></p>

<h4 id="veamos-un-ejemplo-específico-relacionado-con-matemáticas-factorial">¡Veamos un ejemplo específico relacionado con <em>matemáticas</em>, factorial!</h4>

<p>También tenemos 2 enfoques, transversal y <em>recursivo</em>, ¡pero aquí solo consideramos enfoques sobre <strong>recursión</strong>! ¡Te mostraré cómo funciona la pila en una llamada recursiva! ¡Primero, escribiré una función recursiva que calcule el factorial de un número!</p>

<blockquote>
  <p>Por ejemplo, el factorial de 5 se calculará como <code class="language-plaintext highlighter-rouge">factorial (5) = 5 * 4 * 3 * 2 * 1 = 5!</code></p>
</blockquote>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">fact</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="c1">// factorial</span>
<span class="p">{</span>
    <span class="k">if</span><span class="p">(</span><span class="n">x</span><span class="o">==</span><span class="mi">1</span><span class="p">)</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">fact</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">x</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<ul>
  <li>Ahora veamos que pasa cuando llamamos a la función para calcular el factorial de 3 <code class="language-plaintext highlighter-rouge">fact(3)</code>:</li>
</ul>

<p><img src="https://cdn-images-1.medium.com/max/800/1*YRkMsMPRFAt8Y9BiC0QVDg.png" alt="ilustración" /></p>

<ul>
  <li><strong>Explicar</strong> :
    <ul>
      <li><code class="language-plaintext highlighter-rouge">fact(3)</code> -&gt; la función comprueba si x es igual a 1 o no, pero aquí x = 3 por lo que la expresión lógica <code class="language-plaintext highlighter-rouge">x == 1</code> resultará en <code class="language-plaintext highlighter-rouge">falso</code>. En este momento, la función llamará a la función <code class="language-plaintext highlighter-rouge">fact(x-1)</code> que significa <code class="language-plaintext highlighter-rouge">fact(2)</code></li>
      <li>
        <p>En este punto, la función llamada <code class="language-plaintext highlighter-rouge">fact(2)</code> se colocará en la parte superior de la pila. Seguimos haciéndolo.</p>
      </li>
      <li>
        <p><code class="language-plaintext highlighter-rouge">fact(2)</code> -&gt; es similar a <code class="language-plaintext highlighter-rouge">fact(3)</code>, la función comprueba si x es igual a 1 o no, pero aquí x = 2, por lo que la función llamará a <code class="language-plaintext highlighter-rouge">fact(1)</code> y lo colocará pila <code class="language-plaintext highlighter-rouge">hecho (1)</code></p>
      </li>
      <li>
        <p><code class="language-plaintext highlighter-rouge">fact(1)</code>-&gt; la función comprueba si es verdadero igual a 1, por lo que el resultado devolverá <code class="language-plaintext highlighter-rouge">1</code>. Ahora la pila consta de 3 funciones, saque la función <code class="language-plaintext highlighter-rouge">fact(1)</code> que se insertó antes.</p>
      </li>
      <li>
        <p>Continúe obteniendo la función <code class="language-plaintext highlighter-rouge">fact(2)</code>, el resultado es <code class="language-plaintext highlighter-rouge">fact(2) = fact(1) * 2 = 2!</code></p>
      </li>
      <li>Finalmente obtén la función <code class="language-plaintext highlighter-rouge">fact(3)</code>, obtenemos <code class="language-plaintext highlighter-rouge">fact(3) = fact(2) * 3 = 3!</code></li>
    </ul>
  </li>
  <li><strong>Comentario</strong> :
En una función recursiva siempre hay una condición que crea un punto de interrupción para la recurrencia. ¡Sin un punto de interrupción, la recursividad es como un bucle infinito!</li>
</ul>

<h4 id="ya-encontraste-la-llave">¿Ya encontraste la llave?</h4>
<ul>
  <li>Volvamos al primer problema de cómo encontrar la llave. Recordamos que el primer método era hojear frente a la pila de cajas.</li>
</ul>

<p><img src="https://cdn-images-1.medium.com/max/800/1*qFezr1s9YpK6-GsMJqwhOA.png" alt="primer problema" /></p>

<ul>
  <li>Notamos que para <strong>recursión</strong> no tenemos montones de cajas. De hecho, con el enfoque <strong>recursivo</strong>, ¡la pila de cajas es la <code class="language-plaintext highlighter-rouge">pila</code> de funciones de llamada!
    <h3 id="y-gracias-a-la-recursividad-finalmente-encontramos-la-llave-y-abrimos-la-habitación"><strong>¡Y gracias a la recursividad, finalmente encontramos la llave y abrimos la habitación!</strong></h3>
  </li>
</ul>

<p><img src="https://cdn-images-1.medium.com/max/800/1*8Y0_goJ5oKvt1tzSX4d8Tw.png" alt="fin" /></p>

<h2 id="3-aplica-recursividad-a-algoritmos-específicos">3. ¡Aplica recursividad a algoritmos específicos!</h2>
<blockquote>
  <p><em>“El primer día que entré a la clase, me sorprendió. Mis amigos se hacían preguntas sobre matemáticas e informática. Dondequiera que iba, escuchaba la palabra “regla”. Cada lección podía resolverse con “regla”. esta palabra es tan buena, es tan hermosa. Solo más tarde descubrí que escuché mal la palabra “recursión”.”</em>- cita
<a href="http://vnoi.info/wiki/algo/basic/hoc-tin-the-nao-1">¿Cómo aprendí informática? - VNOI</a></p>
</blockquote>

<ul>
  <li>La recursividad se utiliza en la mayoría de los algoritmos y estructuras de datos importantes, como el árbol de segmentos/árbol de intervalos, el árbol BIT, algoritmos gráficos como BFS, DFS.</li>
  <li>Presta atención a las características importantes: es la condición de parada de la recursión, recuerda muy bien, si no hay condición de parada, no podrás salir de la recursión :v.</li>
</ul>

<p><img src="https://scontent.fhph1-1.fna.fbcdn.net/v/t1.0-9/33788776_2043965972590796_7349119704121737216_n.jpg?_nc_cat=102&amp;_nc_oc=AQmyOLZGnYKycVL5j7 rhSA csVtDFvStP8BNrMeWgd86DO_o3wHHfZjyA&amp;_nc_ht=scontent.fhph1-1 .fna&amp;oh= dc1c28378e6d92da40e22c4c06f9a312&amp;oe=5D5A1634" alt="Ejemplo de recursión" /></p>

<ul>
  <li>En la siguiente parte, lo guiaré a través de una técnica de desarrollo de recursividad, que es la base de <strong>QHD - programación dinámica</strong>, ¡una técnica bastante común y que resuelve muchos problemas difíciles!</li>
</ul>

<h3 id="fuente-de-referencia"><em>Fuente de referencia</em></h3>
<p>[primero. Cómo funciona la recursividad: explicado con diagramas de flujo y un video</p>

<p><a href="https://en.wikipedia.org/wiki/Recursion">2. Recursión - Wikipedia</a></p>

<h2 id="si-ha-terminado-de-leer-este-artículo-y-todavía-no-entiende-qué-es-la-recursividad--vea-mi-parte-2-en-aquí">Si ha terminado de leer este artículo y todavía no entiende qué es la recursividad :&gt; ¡vea mi parte 2 en <a href="https://josuerom.github.io/recursion-2">aquí</a>!</h2>]]></content><author><name></name></author><category term="recursion" /><summary type="html"><![CDATA[Que es la recursividad :<]]></summary></entry><entry><title type="html">Parte 2: ¡Todo sobre la recursividad!</title><link href="https://josuerom.github.io/recursion-2/" rel="alternate" type="text/html" title="Parte 2: ¡Todo sobre la recursividad!" /><published>2023-06-03T00:00:00+00:00</published><updated>2023-06-03T00:00:00+00:00</updated><id>https://josuerom.github.io/recursion-2</id><content type="html" xml:base="https://josuerom.github.io/recursion-2/"><![CDATA[<center> <h1> <b> <a href="https://josuerom.github.io/recursion/" target="_blank" title="Todo sobre la recursividad de A -&gt; Z">Publicaciones</a> ¡Esto contiene todo sobre la recursividad! </b> <h1>
</h1></h1></center>]]></content><author><name></name></author><category term="recursion" /><summary type="html"><![CDATA[..........]]></summary></entry></feed>