recursive versions