Интересует оптимальное рекурсивное решение задачки. У самого только кривой код, который кучу памяти жрет.
package com.javarush.task.task03.task0313;

import java.util.ArrayList;
/*
Мама мыла раму
*/

public class Solution {
    public static void main(String[] args) {
        ArrayList<String> strings = new ArrayList<String>();
        strings.add("Мама");
        strings.add("Мыла");
        strings.add("Раму");

        transposition("", strings); // хорошо бы не передавать сюда пустую строку, и не создавать отдельный метод с начальными аргументами
    }

    public static void transposition(String word, ArrayList<String> arr) {
        if(arr.size() == 1)
            System.out.println(word + arr.get(0));
        for(int i = 0; i < arr.size(); i++) {
            String wr = word + arr.get(i);
            ArrayList<String> copy = (ArrayList<String>)arr.clone();
            copy.remove(i);
            transposition(wr, copy);
        }
    }
}