my $n = 3; my $k = 2; my @todo_list = ([ 0, [] ]); while (@todo_list) { my $todo = pop @todo_list; my $local_n = $todo->[0] +1; for my $curr_k (1..$k) { if ($local_n == $n) { say join(', ', @{$todo->[1]}, $curr_k); } else { push @todo_list, [ $local_n, [ @{$todo->[1]}, $curr_k ] ]; } } }