{"id":2169,"date":"2014-10-15T18:59:46","date_gmt":"2014-10-15T16:59:46","guid":{"rendered":"http:\/\/descartesjs.org\/documentacion\/?p=2169"},"modified":"2021-08-07T16:14:02","modified_gmt":"2021-08-07T15:14:02","slug":"ciclos-o-bucles-anidados","status":"publish","type":"post","link":"https:\/\/reddescartes.org\/documentacion\/ciclos-o-bucles-anidados\/","title":{"rendered":"Ciclos o bucles anidados"},"content":{"rendered":"<p>La anidaci\u00f3n de ciclos o bucles es necesaria para hacer determinados procesamientos un poco m\u00e1s complejos que los que realiza un ciclo simple. En Descartes, el ciclo simple es del tipo DO-WHILE (v\u00e9ase <a href=\"https:\/\/descartesjs.org\/documentacion\/?cat=37\">http:\/\/descartesjs.org\/documentacion\/?cat=37<\/a>).<\/p>\n<p>No obstante, existen otras estructuras para definir un ciclo, entre ellas, las de tipo FOR\/NEXT. En Javascript, un ciclo anidado tiene una estructura como la que sigue:<\/p>\n<p><span style=\"color: #0000ff;\">for (i=0;i&lt;10;i++){\u00a0<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0 for (j=0;j&lt;10;j++) {\u00a0<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0 document.write(i + \u00ab-\u00bb + j)\u00a0<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0 }\u00a0<\/span><\/p>\n<p><span style=\"color: #0000ff;\">}<\/span><\/p>\n<p style=\"text-align: justify;\">La ejecuci\u00f3n de este ejemplo funcionar\u00e1 de la siguiente manera. Para empezar se inicializa el primer ciclo, con lo que la variable i valdr\u00e1 cero, \u00a0a continuaci\u00f3n se inicializa el segundo ciclo, con lo que la variable j valdr\u00e1 tambi\u00e9n cero. En cada iteraci\u00f3n se imprime el valor de la variable i, un gui\u00f3n (\u00ab-\u00ab) y el valor de la variable j, como las dos variables valen cero, se imprimir\u00e1 el texto \u00ab0-0\u00bb en la p\u00e1gina web.\u00a0 Debido al flujo del programa, el ciclo que est\u00e1 anidado es el que m\u00e1s veces se ejecuta; por ejemplo, cuando la variable i toma el valor de uno, se ejecuta el ciclo interno con j desde 0 hasta 10, obteni\u00e9ndose la siguiente impresi\u00f3n en la web:<\/p>\n<p>1-0<br \/>\n1-1<br \/>\n1-2<br \/>\n1-3<br \/>\n1-4<br \/>\n1-5<br \/>\n1-6<br \/>\n1-7<br \/>\n1-8<br \/>\n1-9<\/p>\n<p>Para cada iteraci\u00f3n del ciclo externo se ejecutar\u00e1n las 10 iteraciones del ciclo interno o anidado.<\/p>\n<p>Siguiendo este estructura, veamos dos ejemplos con Descartes:<\/p>\n<p><strong>Ejemplo 1. C\u00e1lculo de los factoriales de los primeros nueve n\u00fameros naturales<\/strong><\/p>\n<p>El c\u00f3digo que resuelve el problema es:<\/p>\n<p><span style=\"color: #0000ff;\">for ( i=1; i &lt; 9; i++) \u00a0{<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Factorial[i]=1<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0for (j=1; j&lt; i; j++)\u00a0 {<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0Factorial[i]=Factorial[i]*j<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span><\/p>\n<p><span style=\"color: #0000ff;\">}<\/span><\/p>\n<p>En el editor de\u00a0Descartes har\u00edamos lo siguiente:<\/p>\n<p>En el algoritmo de INICIO, invocamos la funci\u00f3n factorial()<\/p>\n<p><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo2.png\"><img class=\" wp-image-2170 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo2.png\" alt=\"ciclo2\" width=\"596\" height=\"107\" srcset=\"https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo2.png 684w, https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo2-300x53.png 300w\" sizes=\"(max-width: 596px) 100vw, 596px\" \/><\/a><\/p>\n<p>Definimos el vector Factorial, que almacenar\u00e1 los n\u00fameros factoriales:<\/p>\n<p><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo3.png\"><img class=\" wp-image-2171 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo3.png\" alt=\"ciclo3\" width=\"607\" height=\"93\" srcset=\"https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo3.png 712w, https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo3-300x45.png 300w\" sizes=\"(max-width: 607px) 100vw, 607px\" \/><\/a><\/p>\n<p>Creamos el ciclo externo a trav\u00e9s de la funci\u00f3n Factorial():<\/p>\n<p><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo4.png\"><img class=\" wp-image-2172 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo4.png\" alt=\"ciclo4\" width=\"439\" height=\"413\" srcset=\"https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo4.png 524w, https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo4-300x282.png 300w\" sizes=\"(max-width: 439px) 100vw, 439px\" \/><\/a><\/p>\n<p>El ciclo externo invoca al ciclo interno, a trav\u00e9s de la funci\u00f3n Calcula(). Creamos, entonces, este ciclo as\u00ed:<\/p>\n<p><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo5.png\"><img class=\" wp-image-2173 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo5.png\" alt=\"ciclo5\" width=\"484\" height=\"433\" srcset=\"https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo5.png 555w, https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo5-300x269.png 300w\" sizes=\"(max-width: 484px) 100vw, 484px\" \/><\/a><\/p>\n<p>Luego, con una familia de textos, imprimimos el resultado:<\/p>\n<p><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo6.png\"><img class=\" wp-image-2174 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo6.png\" alt=\"ciclo6\" width=\"570\" height=\"145\" srcset=\"https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo6.png 637w, https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo6-300x76.png 300w\" sizes=\"(max-width: 570px) 100vw, 570px\" \/><\/a><\/p>\n<p>Finalmente, ejecutamos y obtenemos:<\/p>\n<p><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo7.png\"><img class=\"size-full wp-image-2175 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/ciclo7.png\" alt=\"ciclo7\" width=\"172\" height=\"256\" \/><\/a><\/p>\n<p><strong>Ejemplo 2. Algoritmo de ordenamiento y la Mediana<\/strong><\/p>\n<p>Joel Espinosa Longi propone cuatro tipos de algoritmos de ordenamiento (v\u00e9ase <a href=\"https:\/\/proyectodescartes.org\/Un_100\/materiales_didacticos\/_Un_081_AlgoritmosDeOrdenamiento\/index.html\">http:\/\/proyectodescartes.org\/Un_100\/materiales_didacticos\/_Un_081_AlgoritmosDeOrdenamiento\/index.html<\/a>). Para este ejemplo, hemos escogido el tipo burbuja.<\/p>\n<p>Este algoritmo es \u00fatil para algunas aplicaciones; por ejemplo, Si deseamos calcular la mediana de N n\u00fameros dados, almacenados en el vector A, el algoritmo propuesto por Joel, ser\u00eda:<\/p>\n<p><span style=\"color: #0000ff;\">for (i=0; i&lt;N; i++) {<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for (j = 0; j&lt;N-1-i; j++) {<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (A[j] &gt; A[j+1]) {<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 intercambia(A[j], A[j+1])<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/p>\n<p><span style=\"color: #0000ff;\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><\/p>\n<p><span style=\"color: #0000ff;\">}<\/span><\/p>\n<p>En el editor Descartes lo har\u00edamos as\u00ed:<\/p>\n<p>En el algoritmo de INICIO, hemos definido el valor de N e invocado tres funciones, que explicamos a continuaci\u00f3n:<\/p>\n<p><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje1.png\"><img class=\"size-full wp-image-2177 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje1.png\" alt=\"eje1\" width=\"410\" height=\"171\" srcset=\"https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje1.png 410w, https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje1-300x125.png 300w\" sizes=\"(max-width: 410px) 100vw, 410px\" \/><\/a><\/p>\n<p>La funci\u00f3n datos() se encarga de generar 20 n\u00fameros aleatorios (previamente, definimos el vector A con un tama\u00f1o de 21):<\/p>\n<p><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje2.png\"><img class=\" wp-image-2178 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje2.png\" alt=\"eje2\" width=\"355\" height=\"330\" srcset=\"https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje2.png 470w, https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje2-300x279.png 300w\" sizes=\"(max-width: 355px) 100vw, 355px\" \/><\/a><\/p>\n<p>La funci\u00f3n ordena() genera el ciclo externo para la variable i, en el que se invoca el ciclo interno compara():<\/p>\n<p><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje3.png\"><img class=\" wp-image-2179 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje3.png\" alt=\"eje3\" width=\"343\" height=\"373\" \/><\/a><\/p>\n<p>La funci\u00f3n compara() se encarga de verificar la condici\u00f3n del algoritmo tipo burbuja, que de cumplirse, realiza el intercambio:<\/p>\n<p><a href=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje4.png\"><img class=\" wp-image-2180 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje4.png\" alt=\"eje4\" width=\"505\" height=\"353\" srcset=\"https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje4.png 638w, https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje4-300x209.png 300w\" sizes=\"(max-width: 505px) 100vw, 505px\" \/><\/a><\/p>\n<p>Finalmente, creamos una familia de textos que nos muestra los resultados, uno de ellos es:<\/p>\n<p><a href=\"http:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje5.png\"><img class=\"size-full wp-image-2181 aligncenter\" src=\"https:\/\/descartesjs.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje5.png\" alt=\"eje5\" width=\"603\" height=\"58\" srcset=\"https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje5.png 603w, https:\/\/reddescartes.org\/documentacion\/wp-content\/uploads\/2014\/10\/eje5-300x28.png 300w\" sizes=\"(max-width: 603px) 100vw, 603px\" \/><\/a><\/p>\n<p>Escena de aplicaci\u00f3n. A continuaci\u00f3n, se presenta una escena interactiva que utiliza el algoritmo anterior:<\/p>\n<p style=\"text-align: center;\">\n<!-- iframe plugin v.4.5 wordpress.org\/plugins\/iframe\/ -->\n<iframe src=\"https:\/\/descartesjs.org\/repositorio\/Ciclos_Anidados_JS\/mediana.html\" width=\"710\" height=\"570\" scrolling=\"yes\" class=\"iframe-class\" frameborder=\"0\"><\/iframe>\n<\/p>\n<p style=\"text-align: center;\">(Puede descargar esta escena desde <a href=\"https:\/\/descartesjs.org\/repositorio\/Ciclos_Anidados_JS.zip\">este enlace<\/a>)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La anidaci\u00f3n de ciclos o bucles es necesaria para hacer determinados procesamientos un poco m\u00e1s complejos que los que realiza un ciclo simple. En Descartes, el ciclo simple es del tipo DO-WHILE (v\u00e9ase http:\/\/descartesjs.org\/documentacion\/?cat=37). No obstante, existen otras estructuras para definir un ciclo, entre ellas, las de tipo FOR\/NEXT. En Javascript, un ciclo anidado tiene una estructura como la que sigue: for (i=0;i&lt;10;i++){\u00a0 \u00a0\u00a0\u00a0 for (j=0;j&lt;10;j++) {\u00a0 \u00a0\u00a0\u00a0 document.write(i + \u00ab-\u00bb + j)\u00a0 \u00a0\u00a0\u00a0 }\u00a0 } La ejecuci\u00f3n de este ejemplo funcionar\u00e1 de la siguiente manera. Para empezar se inicializa el primer ciclo, con lo que la variable i valdr\u00e1<\/p>\n<a class=\"more-link\" rel=\"nofollow\" href=\"https:\/\/reddescartes.org\/documentacion\/ciclos-o-bucles-anidados\/\">[Leer m\u00e1s...]<\/a>","protected":false},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[32],"tags":[],"_links":{"self":[{"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/posts\/2169"}],"collection":[{"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/comments?post=2169"}],"version-history":[{"count":10,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/posts\/2169\/revisions"}],"predecessor-version":[{"id":3507,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/posts\/2169\/revisions\/3507"}],"wp:attachment":[{"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/media?parent=2169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/categories?post=2169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/reddescartes.org\/documentacion\/wp-json\/wp\/v2\/tags?post=2169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}