Рекурсия останавливается, когда вы видите первый подсписок с суммой n
.Проблема не только в цикле, но и в критериях выхода. Ваша рекурсивная функция должна прекратиться, когда длина подсписка равна 0.
Здесь я только что написал работающее, рекурсивное решение вашей проблемы.Это отличается, но я не смог исправить твою.Пока вы начинаете с пустого подсписка, я решил начать рекурсию с полного списка, разделив его на более мелкие подсписки.Это создает древовидную структуру:
[1234]
[123] [234]
[12] [23] [34]
[1][2] [3] [4]
Мы сразу видим, что мы должны идти «вправо», пока не достигнем первого листа (1
), затем мы идем только «налево».Таким образом, мы посещаем все подсписки только один раз.
Вот идея, написанная на Java:
public static void main (String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(3);
list.add(4);
list.add(0);
printSublists(list, list, 4, true, 0);
}
public static void printSublists(List<Integer> numbers, List<Integer> sublist, int n, boolean walkRight, int level) {
// the test
if (sum(sublist) == n)
System.out.println(sublist);
// the exit criteia (leaf reached)
if (sublist.size() == 1)
return;
// visit the right sublist
if (walkRight)
printSublists(numbers, sublist.subList(0, sublist.size()-1), n, walkRight, level+1);
// we only walk the right path once
walkRight = false;
// visit the left sublist
printSublists(numbers, sublist.subList(1, sublist.size()), n, walkRight, level+1);
}
И это вывод:
[1, 3]
[4]
[4, 0]