Первые алгоритмы c недостаток:
Здесь есть недостаток алгоритми c:
int largeElmt = largestElement(numbers, startIdx); // (1)<=========
counter += increasing_sequences_recursive(numbers, startIdx - 1);
if (numbers[startIdx - 1] <= largeElmt) { // (2)<=========
counter++;
В (1) вы ищете самый большой элемент в startIdx
первые цифры. Поскольку largestElmt
является наибольшим в подмассиве, условие в (2) всегда выполняется. Таким образом, вы всегда добавляете 1 к рекурсивному результату, который начинается с 1. Таким образом, в конце вы только подсчитываете количество элементов в массиве (хотя и сложным образом).
Второй алгоритм c недостаток:
Теперь вы можете исправить это, просто проверив, что последние цифры уменьшаются:
if (numbers[startIdx-2]<=numbers[startIdx - 1] ) // no need for largest
Это нормально с точки зрения индекса , поскольку startIdx
гарантированно будет как минимум 2. К сожалению, ваша рекурсия не учитывает смежность. Таким образом, вы просто будете считать последующие пары, которые увеличиваются, без перезапуска счета в случае сбоя. Итак, здесь вы найдете 8.
Выход?
Вам нужно выделить guish в своей рекурсии в случае, когда вы продлеваете последовательность (просто добавляя одну к текущая длина), а также случай, когда у вас есть сбой (и придется перезапустить с 1). В обоих случаях вы должны следить за самой длинной последовательностью. Поэтому вам нужно как минимум передать что-то большее в качестве параметра рекурсии, если вы хотите рекурсию элемент за элементом.
Но так ли это должно быть? Если нет, вы могли бы oop найти последовательность возрастающих чисел и использовать рекурсию, чтобы найти наибольшую такую последовательность в остальной части массива, как только вы обнаружите нарушение. Это было бы намного проще!