#!/usr/bin/perl # http://perlmonks.org/?node_id=1211497 use strict; use warnings; use Data::Dump 'pp'; sub up { my ($row, $col) = $_[0]->@*; return $row == 0 && $col == 0 ? [ map [ @$_ ], @_ ] : (($row > 0 && $col > 0 ? up( [ ~-$row, ~-$col ], @_ ) : () ), ($row > $col ? up( [ ~-$row, $col ], @_ ) : () ) ); } pp up [ 3, 1 ]; #### ( [[0, 0], [1, 0], [2, 0], [3, 1]], [[0, 0], [1, 0], [2, 1], [3, 1]], [[0, 0], [1, 1], [2, 1], [3, 1]], )