{"id":145,"date":"2023-04-21T03:41:13","date_gmt":"2023-04-21T03:41:13","guid":{"rendered":"https:\/\/canessaalvamiguel.dev\/?p=145"},"modified":"2023-05-10T01:36:02","modified_gmt":"2023-05-10T01:36:02","slug":"loops-and-tail-recursion-in-scala","status":"publish","type":"post","link":"https:\/\/canessaalvamiguel.dev\/index.php\/2023\/04\/21\/loops-and-tail-recursion-in-scala\/","title":{"rendered":"Loops and Tail Recursion in Scala"},"content":{"rendered":"\n<p>Los loops y la recursi\u00f3n son herramientas esenciales en la programaci\u00f3n, y Scala proporciona una serie de formas para implementarlos. En este art\u00edculo, discutiremos c\u00f3mo utilizar loops y la recursi\u00f3n en Scala, y presentaremos ejemplos de ambos en acci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Loops en Scala<\/h2>\n\n\n\n<p>Los loops en Scala se implementan utilizando los constructos <code>while <\/code>y <code>for<\/code>. La sintaxis b\u00e1sica para <code>while<\/code> es:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nwhile (condici\u00f3n) {\n  \/\/ cuerpo del bucle\n}\n<\/pre><\/div>\n\n\n<p>La condici\u00f3n se eval\u00faa en cada iteraci\u00f3n del bucle, y mientras sea verdadera, el cuerpo del bucle se ejecutar\u00e1. Cuando la condici\u00f3n se eval\u00faa como falsa, el bucle termina.<\/p>\n\n\n\n<p>El siguiente ejemplo utiliza un bucle <code>while<\/code> para imprimir los n\u00fameros del 1 al 5:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nvar i = 1\nwhile (i &lt;= 5) {\n  println(i)\n  i += 1\n}\n<\/pre><\/div>\n\n\n<p>La sintaxis b\u00e1sica para <code>for<\/code> es:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nfor (variable &lt;- rango) {\n  \/\/ cuerpo del bucle\n}\n<\/pre><\/div>\n\n\n<p><code>variable<\/code> es una variable que se utiliza para iterar a trav\u00e9s del rango especificado. <code>rango<\/code> puede ser un rango de valores o una colecci\u00f3n de datos. El siguiente ejemplo utiliza un bucle <code>for<\/code> para imprimir los n\u00fameros del 1 al 5:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nfor (i &lt;- 1 to 5) {\n  println(i)\n}\n<\/pre><\/div>\n\n\n<p><code>to<\/code> es un m\u00e9todo en la clase <code>Int<\/code> que devuelve un rango de valores desde el valor inicial hasta el valor final especificado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tail recursion en Scala<\/h2>\n\n\n\n<p>La recursi\u00f3n es una t\u00e9cnica de programaci\u00f3n en la que una funci\u00f3n se llama a s\u00ed misma para resolver un problema m\u00e1s peque\u00f1o. Sin embargo, <code>en algunos casos, la recursi\u00f3n puede ser ineficiente y provocar desbordamiento de pila. La recursi\u00f3n de cola (tail recursion) es una t\u00e9cnica que permite evitar el desbordamiento de pila en situaciones en las que se llama a la misma funci\u00f3n muchas veces.<\/code><\/p>\n\n\n\n<p>En tail recursion, <strong><code>la llamada recursiva es la \u00faltima acci\u00f3n realizada en la funci\u00f3n<\/code><\/strong>. Esto significa que no hay ning\u00fan c\u00e1lculo o procesamiento que se realice despu\u00e9s de la llamada recursiva. En lugar de crear una nueva pila de llamadas en cada llamada recursiva, la recursi\u00f3n de cola utiliza la misma pila de llamadas para cada iteraci\u00f3n. Esto permite que la recursi\u00f3n sea m\u00e1s eficiente y evita el desbordamiento de pila. En Scala se debe de usar la anotacion <code>@tailrec<\/code> para indicarle al compilador que debe tratar a la funcion de esa manera. A continuacion un ejemplo para el calculo del factorial:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\ndef factorial(n: Int): Int = {\n\n  @tailrec\n  def factorialHelper(n: Int, acc: Int): Int = {\n    if (n == 0) acc\n    else factorialHelper(n - 1, n * acc)\n  }\n\n  factorialHelper(n, 1)\n}\n\nprintln(factorial(5))\n<\/pre><\/div>\n\n\n<p>La funci\u00f3n <code>factorial<\/code> llama a la funci\u00f3n auxiliar <code>factorialHelper<\/code> para realizar la recursi\u00f3n. <code>@tailrec<\/code> es una anotaci\u00f3n que asegura que la funci\u00f3n es una funci\u00f3n recursiva de cola, lo que significa que la llamada recursiva es la \u00faltima acci\u00f3n realizada en la funci\u00f3n.<\/p>\n\n\n\n<p>En este ejemplo, <code>factorialHelper<\/code> toma dos argumentos: <code>n<\/code>, que es el n\u00famero para calcular el factorial, y <code>acc<\/code>, que es un acumulador que se utiliza para almacenar el valor calculado. Si <code>n<\/code> es igual a cero, la funci\u00f3n devuelve <code>acc<\/code>. De lo contrario, la funci\u00f3n llama a <code>factorialHelper<\/code> con <code>n-1<\/code> y <code>n*acc<\/code>. La llamada recursiva se realiza como la \u00faltima acci\u00f3n en la funci\u00f3n, y se almacenan los valores necesarios en el acumulador.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los loops y la recursi\u00f3n son herramientas esenciales en la programaci\u00f3n, y Scala proporciona una serie de formas<\/p>\n","protected":false},"author":1,"featured_media":62,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[30,8,31],"class_list":["post-145","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scala","tag-loops","tag-scala","tag-tail-recursion"],"_links":{"self":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/145","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/comments?post=145"}],"version-history":[{"count":6,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/145\/revisions"}],"predecessor-version":[{"id":176,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/145\/revisions\/176"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/media\/62"}],"wp:attachment":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/media?parent=145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/categories?post=145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/tags?post=145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}