public List<String> fillNSlots(int n){ return fillNSlotsWithPrefix(0, n, ""); } private List<String> fillNSlotsWithPrefix(int counter, int n, String prefix){ if (counter==n-1){ return new ArrayList<String>(Arrays.asList(new String[]{prefix + "0", prefix + "1"})); }else{ List<String> result1 = fillNSlotsWithPrefix(counter+1, n , prefix + "0"); result1.addAll(fillNSlotsWithPrefix(counter+1, n , prefix + "1")); return result1; } }
It is not quite there, as there is still a need to hold an intermediate state with a temporary variable, result1 above, which could have been avoided had List supported an API which adds an element and returns itself or returns a new list.
The following is an equivalent implementation in scala:
def fillNSlots(n:Int):List[String] = { fillNSlotsWithPrefix(0,n,"") } def fillNSlotsWithPrefix(counter:Int, n: Int, prefix:String): List[String] = { if (counter==(n-1)) (prefix+"0")::(prefix+"1")::List() else fillNSlotsWithPrefix(counter+1, n, prefix+"0"):::fillNSlotsWithPrefix(counter+1, n, prefix+"1") }