while-loopjulia

# Julia code does not break out of the loop

I have written the following code in Julia to output an array of Fibonacci numbers less than or equal to 4000000:

``````F = []
fib_1 = 0
fib_2 = 1

push!(F, fib_1, fib_2)

while fib_2 <= 4000000
next_fib = fib_2 + fib_1
push!(F, next_fib)
fib_1 = fib_2
fib_2 = next_fib
end
println(F)
``````

For some reason, a number greater than 4000000 also gets pushed into the array as shown in bold below:

Any[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887]

There seems to be something wrong with my while condition but for the world of me cannot see what.

I am from a Python background and am new to Julia so any help to demystify this is greatly appreciated.

Many thanks.

Solution

• After a new value is calculated `next_fib = fib_2 + fib_1`, it is immediately pushed into the array, without being checked. The check `fib_2 <= 4000000` instead needs to happen between the calculation and the `push!`. (The equivalent Python code returns the exact same result, by the way, so this is independent of language semantics.)

You can change the code instead to something like:

``````function fibo(limit = 4000000)
fib_1 = 0
fib_2 = 1
F = [fib_1]

while fib_2 <= limit
push!(F, fib_2)
fib_1, fib_2 = fib_2, fib_1 + fib_2
end

return F
end

println(fibo())
``````

(Writing things in functions and avoiding global scope is a pretty important habit to get into if you wish to take advantage Julia's performance benefits. Also, initializing `F = [fib_1]` instead of `F = []` creates it as an array of `Int64` instead of the slower `Any` array - in general, `var = []` lines in Julia code should ring some alarm bells, and should be changed to in some way specify the type of the array's elements.)