Вероятно, лучше иметь две переменные в вашей рекурсии в дополнение к тому, на каком элементе вы находитесь. Один с историческим максимумом и один с текущей длиной восходящих элементов. Если у массива есть элемент, вам гарантирован 1 и подсчет до тех пор, пока следующий элемент не уменьшится, то вы перезапустите, возможно, с новым историческим максимумом, или в конце вы вернете максимальную текущую длину и исторический максимум.
Что-то вроде этой реализации схемы?
(define (longest-increasing-sequence lst)
(if (null? lst)
0
(let recur ((lst lst) (cur 1) (hmax 0))
(cond ((null? (cdr lst)) (max hmax cur))
((<= (car lst) (cadr lst)) (recur (cdr lst) (+ cur 1) hmax))
(else (recur (cdr lst) 1 (max hmax cur)))))))
А вот PHP версии одного и того же с использованием массивов вместо связанных списков:
function longest_increasing_sequence($lst)
{
$stop = count($lst)-1;
if($stop < 0)
return 0;
// makes an anonymous function closed over &$lst, $stop and &$recur
$recur = function($idx, $cur_len, $max_len) use (&$lst, $stop, &$recur)
{
$new_idx=$idx+1;
if($idx == $stop)
return max($cur_len, $max_len);
elseif($lst[$idx] <= $lst[$new_idx])
return $recur($new_idx, $cur_len + 1, $max_len);
else
return $recur($new_idx, 1, max($cur_len, $max_len));
};
// start recursion
return $recur(0, 1, 0);
}
Под «длинной неубывающей подпоследовательности», вы только рассмотрим подпоследовательности следующих целых чисел? Или вы можете переупорядочить их по своему усмотрению? (Думаю, что нет, было бы слишком легко!) – Theox
@ Theox только после целых чисел, не разрешается переупорядочивать. – WhyAyala
Не вытекает ли это непосредственно из решения динамического программирования в самую длинную неубывающую проблему подпоследовательности? – Dukeling