recursive list processing