Saltar al contenido principal
LibreTexts Español

5.3: Bucles While

  • Page ID
    113353
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    Otra construcción muy común para la programación se llama bucle while. Básicamente, queremos ejecutar algunas declaraciones mientras que alguna declaración booleana es verdadera. Aquí hay un ejemplo simple, pero poco interesante:

    let
      local n=1 
      while n<5
        println(n)
        n+=1 
      end
    end
     

    y tenga en cuenta que la expresión n+=1 es la abreviatura de n=n+1. Este es un bloque let, que simplemente encapsula el contenido y lo separa de los valores globales. Se puede pensar como una función excepto que simplemente se ejecuta tal cual, no se declara y luego se ejecuta. Tampoco hay argumentos.

    Se puede ver por la salida que se imprimen los números del 1 al 4. Lo que pasa es que

    1. La variable local n se establece en 1
    2. El bucle while comprueba si n<5. Como esto es cierto, el bloque se ejecuta
    3. El valor de n se imprime como 1 y luego se actualiza con la sentencia n+=1 de 1 a 2.
    4. Al final, volvemos a la parte superior del bucle while y se comprueba la sentencia. Desde 2<5, se ejecuta el bloque while loop.
    5. El valor de n se imprime como 2 y luego se actualiza con la sentencia n+=1 de 2 a 3.
    6. Al final, volvemos a la parte superior del bucle while y se comprueba la sentencia. Desde 3<5, se ejecuta el bloque while loop.
    7. El valor de n se imprime como 3 y luego se actualiza con la sentencia n+=1 de 3 a 4.
    8. Al final, volvemos a la parte superior del bucle while y se comprueba la sentencia. Desde 4<5, se ejecuta el bloque while loop.
    9. El valor de n se imprime como 4 y luego se actualiza con la sentencia n+=1 de 4 a 5.
    10. Al final, volvemos a la parte superior del bucle while y se comprueba la sentencia. Dado que 5<5 devuelve false, el bloque while loop no se ejecuta.
    11. el bloque let termina y el bloque de código está terminado.

    Método de bisección

    Un ejemplo más práctico de un bucle while será el Método de Bisección para encontrar una raíz

    function bisection(f::Function,a::Real,b::Real) 
      local c
      while (b-a)>1e-6
        c = 0.5*(a+b) # find the midpoint
        # test if f(a) and f(c) have opposite signs
        # that will determine the new interval
        if f(a)*f(c) < 0 
          b=c
        else
          a=c 
        end
      end # the while loop
      c
    end
     

    En definitiva, este método toma una función f y un intervalo\([a, b]\) y la bisecciona continuamente asegurando que haya una raíz en el intervalo resultante. Continúa mientras la longitud del intervalo sea mayor que 1e-6 o\(10^{-6}\). Para probarlo, considere

     f(x) = x^2-2
     

    que tiene una raíz de 2. La llamada a la función

    bisection(f,1,2)
     

    y este resultado es aproximadamente\(\sqrt{2}\).

    Tenga en cuenta que la sentencia if en la función bisección no utilizó el ternario if-then-else principalmente debido a que se asignaron diferentes variables en cada rama. Si una sola variable tomara un valor diferente, entonces probablemente sería más claro usar el ternario if-then-else.

    Loops Infinitos

    Es común en un bucle while seguir ejecutándolo para siempre. Esto ocurre si hay algún error o no has considerado todos los casos. Por ejemplo, en el método de bisección anterior, si la función no tiene una raíz (like\(f (x) = x^2 + 2\)), entonces esto nunca se detendrá.

    Aquí hay algunas cosas que pueden ayudar a prevenir o depurar el código:

    • Asegúrate de que algo esté cambiando en tu bucle. Si tiene la intención de detener el bucle en un índice, asegúrese de que el índice se esté actualizando.

    • Mira tu código y ve si tienes algo que crees que detendrá el bucle. Lo que sea que esté en la declaración booleana necesita cambiar eventualmente.

    • Consideradadicionaldetenercondición.Puede que necesitastoadavariabletocuenta el número de veces que has pasado por el bucle y detente si golpea a alguna maxi- mamá, que es mayor de lo que esperarías.

    • Detenga el código si es necesario. Es posible que deba interrumpir el kernel. En el REPL, CTRL-C se detendrá y en Jupyter, seleccionando el menú Kernel luego Interrumpir debería detenerlo. El cuadrado en la barra de herramientas también debería funcionar. Consulte la sección A.7 para mayor información.


    This page titled 5.3: Bucles While is shared under a CC BY-NC-SA license and was authored, remixed, and/or curated by Peter Staab.