fully recursive