Skip to main content
Mathematics LibreTexts

5.3: While Loops

  • Page ID
    53669
  • \( \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}}\)

    Another very common construction for programming is called a while loop. Basically, we want to run a few statements while some boolean statement is true. Here’s a simple, but uninteresting example:

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

    and note that the expression n+=1 is shorthand for n=n+1. This is a let block, which just encapsulates the content and separates it from global values.  It can be thought of like a function except it is just run as is, not declared and then run.  Also there are no arguments.  

    You can see from the output that the numbers 1 to 4 are printed.  What happens is that

    1. The local variable n is set to 1
    2. The while loop checks if n<5.  Since this is true, the block is run
    3. The value of n is printed out as 1 and then updated with the statement n+=1 from 1 to 2.  
    4. At the end, we return to the top of the while loop and the statement is checked. Since 2<5, the while loop block is run.
    5. The value of n is printed out as 2 and then updated with the statement n+=1 from 2 to 3.  
    6. At the end, we return to the top of the while loop and the statement is checked. Since 3<5, the while loop block is run.
    7. The value of n is printed out as 3 and then updated with the statement n+=1 from 3 to 4.  
    8. At the end, we return to the top of the while loop and the statement is checked. Since 4<5, the while loop block is run.
    9. The value of n is printed out as 4 and then updated with the statement n+=1 from 4 to 5.
    10. At the end, we return to the top of the while loop and the statement is checked. Since 5<5 returns false, the while loop block is not run.
    11. the let block ends and the code block is finished. 

    Bisection Method

    A more practical example of a while loop will be the Bisection Method for finding a root

    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
     

    In short, this method takes a function f and an interval \([a, b]\) and continually bisects it ensuring there is a root in the resulting interval. It continues while the length of the interval is greater than 1e-6 or \(10^{-6}\). To test it, consider

     f(x) = x^2-2
     

    which has a root of 2. The function call

    bisection(f,1,2)
     

    and this result is approximately \(\sqrt{2}\). 

    Note that the if-statement in the bisection function did not use the ternary if-then-else mainly due to the fact that different variables were assigned in each branch. If a single variable would take on different value, then it would probably be clearer to use the ternary if-then-else.

    Infinite Loops

    It is common in a while loop to keep running it forever. This occurs if there is some bug or you haven’t considered all cases. For example, in the bisection method above, if the function doesn’t have a root (like \(f (x) = x^2 + 2\)), then this will never stop.

    Here’s a few things that can help prevent or debug the code:

    • Make sure something is changing in your loop. If you intend to stop the loop on an index, make sure the index is updating.

    • Look at your code and see if you have something that you think will stop the loop. What ever is in the boolean statement needs to eventually switch.

    • Consideranadditionalstoppingcondition.Youmayneedtoaddavariabletocount the number of times you’ve gone through the loop and stop if it hits some maxi- mum, which is greater than what you would expect.

    • Stop the code if you need to. You may need to interrupt the kernel. In the REPL, CTRL-C will stop and in Jupyter, selecting the Kernel menu then Interrupt should stop it. The square in the toolbar should work too. See section A.7 for more information.


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

    • Was this article helpful?