Programming made easy – loops (ii)
With the basics of for loops, let’s look at an example of an actual program which calculates the Harmonic series, which is an infinite series of the form:
h(n) = 1 + 1/2 + 1/3 + … + 1/n
The code for the program in Fortran, Ada, Julia and C is shown below. The loop is highlighted in blue. For interest sake, the loops are presented in reverse, i.e. 1/n + 1/(n-1) + … + 1, as it illustrates clearly how each language deals with the simple issue of a decreasing index. In each case the starting value of the index variable i is n, and the ending value is 1. Here it is the algorithm for the Harmonic series depicted visually, clearly showing the role of the loop:
Fortran
program harmonic
integer :: n, i
real :: h
read (*,*) n
h = 0
do i = n,1,-1
h = h + 1.0/i
end do
write(*,*) h
end program harmonic
Here the third item (the modifier) in the Fortran loop denotes the type of change to the loop index, in this case, a decrease by 1. In a normal loop incrementing by 1, the modifier can be omitted.
C
#include <stdio.h> int main(void){ int i, n; float h; scanf("%d", &n); printf("%d\n", n); h = 0.0; for (i=n; i>=1; i=i-1) h = h + 1.0/i; printf("%lf\n", h); return 0; }
In the C version, the loop index is decremented using the statement i=i–1. For more than one statement after the for loop definition, the statements would have to be encapsulated in { and }.
Ada
with ada.Float_Text_IO; use Ada.Float_Text_IO; with ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure harmonic is n : integer; h : float; begin get(n); h := 0.0; for i in reverse 1..n loop h := h + 1.0/float(i); end loop; put(h); end harmonic;
In Ada, the keyword reverse is used to specify a loop will be decreasing in value.
Julia
n = parse(Int64, chomp(readline())) println(n) h = 0 for i = n:-1:1 h = h + 1.0/i end println(h)
Here the index modifier is placed in the centre, n:-1:1, implying i has the values n to 1, modified by -1 each loop iteration. In a normal loop incrementing by 1, the modifier can be omitted.
spqr