Если я правильно понимаю вопрос, тогда это должно сработать (код на Haskell, выдаст результаты в порядке, отличном от примера)
combinations [] = []
combinations [x]
|x > 0 = [x]:combinations [(x-1)]
|otherwise = []
combinations (x:xs)
|x > 0 = (map (\c -> x:c) (combinations xs)) ++ combinations((x-1):xs)
|otherwise = []
Или это, чтобы получить его в том же порядке, что иВы дали (также просто более хорошее решение)
combinations' [x] = [[c]|c<-[1..x]]
combinations' (x:xs) = [c:d|c<-[1..x],d<-combinations' xs]
Мне понадобится немного времени, чтобы получить ответ на «императивном» языке (C, Java и т. д.).Это та вещь, где функциональные языки сияют.
Хорошо, так на Java.
Отказ от ответственности: этот код более или менее просто прямой перевод Haskell.Это не чистый или лучший способ сделать что-то.Я не проверял или действительно думал об этом, чтобы убедиться, что это правильно
public List<List<Integer>> combinations(List<Integer> workwith){
List<List<Integer>> d = new LinkedList<LinkedList<Integer>>();
if(workwith.size() == 1){
int max = workwith.get(0);
for(int i = 1; i=<max;i++){
List<Integer> toAdd = new LinkedList<Integer>();
toAdd.add(i);
d.add(toAdd);
}
return d
}
Integer max = workwith.remove(0);
List<List<Integer>> back = combinations(workwith);
for(int i = 1, i<=max;i++)
for(List<Integer> b: back){
List<Integer> toAdd = new LinkedList<Integer>();
toAdd.add(i);
toAdd.addAll(b);
d.add(toAdd)
}
}
return d;
}