Recursion

The main purpose of recursion in this context is to replace nested loop structures of the following form:
Program loops;

const
  zoveel = 4;
  fac = 5;
var
  k1, k2, k3, k4 : byte;

begin
  for k1 := 1 to fac do
    for k2 := 1 to fac do
      for k3 := 1 to fac do
        for k4 := 1 to fac do
        begin
          Writeln(k1,' ',k2,' ',k3,' ',k4);
        end;
end.
The problem is that one cannot dynamically change the depth of the loop structure here, that is the number of loop indices k1, k2, ... kN. This is the real reason why recursion comes in. Just change the constant zoveel (make it 2, 3 or whatever) in the following program and you're done!
Program recursie;

const
  zoveel = 4;
  fac = 5;
var
  loper : array[1..zoveel] of byte;

procedure loops(diep : byte);

var
  d : byte;

begin
  if diep = zoveel then
  begin
    for d := 1 to zoveel do
      Write(loper[d],' ');
    Writeln;
  end else begin
    for d := 1 to fac do
    begin
      loper[diep+1] := d;
      loops(diep+1);
    end;
  end;
end;

begin
  loops(0);
end.
This is not to say, however, that recursion is necessary here (and/or elsewhere).
I still have to see any example where the effect of recursion cannot be accomplished by other means:
Program omzeild;

const
  zoveel = 4;
  fac = 5;
var
  k, loper : byte;
  totaal, L, macht : Longint;

begin
  totaal := 1;
  for k := 1 to zoveel do
     totaal := totaal * fac ;

  for L := 1 to totaal do
  begin
    macht := totaal;
    for k := 1 to zoveel do
    begin
      macht := macht div fac;
      loper := (((L-1) div macht) mod fac) + 1;
      Write(loper,' ');
    end;
    Writeln;
  end;
end.