use strict; use warnings; use List::Util qw( sum ); { my %memoize; sub calcIt { my ($n, $d) = @_; return $memoize{"$n:$d"} ||= ( ($d ? sum map { calcIt($_, $d-1) } 1..$n : $n * ( $n + 1 ) / 2 ) ); } } { my $N = 20; my $D = 7; print('$n\\$d'); for my $d (1..$D) { print("\t$d"); } print("\n"); for my $n (1..$N) { print("$n"); for my $d (1..$D) { print("\t", calcIt($n, $d)); } print("\n"); } }