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}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)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:
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
- La variable local
n
se establece en 1 - El bucle while comprueba si
n<5
. Como esto escierto
, el bloque se ejecuta - El valor de
n
se imprime como 1 y luego se actualiza con la sentencian+=1
de 1 a 2. - Al final, volvemos a la parte superior del bucle while y se comprueba la sentencia. Desde
2<5
, se ejecuta el bloque while loop. - El valor de
n
se imprime como 2 y luego se actualiza con la sentencian+=1
de 2 a 3. - Al final, volvemos a la parte superior del bucle while y se comprueba la sentencia. Desde
3<5
, se ejecuta el bloque while loop. - El valor de
n
se imprime como 3 y luego se actualiza con la sentencian+=1
de 3 a 4. - Al final, volvemos a la parte superior del bucle while y se comprueba la sentencia. Desde
4<5
, se ejecuta el bloque while loop. - El valor de
n
se imprime como 4 y luego se actualiza con la sentencian+=1
de 4 a 5. - 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. - 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
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
que tiene una raíz de 2. La llamada a la función
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.