La tua impostazione iniziale è corretta, intanto fai in modo che il programma provi tutte le combinazioni di parole, perciò tutte quelle che stanno bene insieme le attacca.
Quindi l'idea sarebbe che ad ogni chiamata della funzione ricorsiva, ogni volta che scendi sempre di più di "livello" di ricorsione, ti avvicinerai sempre più a quella che sarà l'ultima parola, quella che chiude la frase insomma.
Se il programma riesce in questo intento, cioè arrivi all'ultima parola, avendo usato tutte le altre, BENE! Questo vuol dire che tutte le parole sono state concatenate nel modo più corretto, come definito dalla consegna. Ovviamente per fare ciò nel mezzo dovrai controllare le parole che "appiccichi" tra loro, se arrivi ad un punto che ti ritrovi a dover appendere una parola che hai già usato, sicuramente quella non era la combinazione giusta e perciò provi le altre oppure risali di "livello".
E siccome la consegna richiede che al ritorno la funzione restituisca una lista di interi corrispondenti alle posizioni delle parole nel file, mentre attacchi le parole tieni conto anche di questo fatto.
Intanto fallo funzionare, all'ottimizzazione ci pensi dopo e non ti demoralizzare che non sei l'unico ad aver saltato il primo appello 
