Pascal, 128 bytes ================= One recursive procedure takes care of everything. procedure m(i,j:integer);begin if i<1then Exit;if i=j then begin m(i-1,j-1);writeln;end;m(i-1,j);write(i,'x',j,'=',i*j,' ');end; Ungolfed: procedure mul(i, j: integer); begin if i<1 then Exit; if i=j then begin mul(i-1, j-1); writeln; end; mul(i-1, j); write(i,'x',j,'=',i*j,' '); end;