Major optimization, rewrite to avoid deep recursion if possible.