don't store the column headers separately (speed gains were negligible to non-existant) and use explicit recursion (2x speed up)