Quindi è sufficiente stampare la lunghezza dell'elenco, non la lista stessa? Questo aiuta, perché semplifica la gestione della memoria (che è un problema per c).
Questa è davvero solo una ricerca glorificata. In ogni punto è necessario conoscere (1) il valore corrente (se presente); (2) la lunghezza corrente (se presente); (3) la posizione nell'elenco; (4) la più grande lunghezza conosciuta. L'utilizzo di una lunghezza pari a zero aiuta a tracciare quando non si ha un valore corrente (quindi non è necessario un valore iniziale "magico"). Il valore di ritorno dovrebbe essere la lunghezza maggiore.
Su ciascuna ricorsione è possibile saltare il numero corrente o includerlo nell'elenco (ma solo se è inferiore al valore corrente).
modo che il codice è solo:
#include <stdio.h>
int max(int a, int b) {
return a > b ? a : b;
}
int find(int* data, int total_length, int offset, int previous,
int run_length, int max_length) {
// update max length if it has improved
if (run_length > max_length) max_length = run_length;
// if we are at the end, return max
if (offset == total_length) return max_length;
// if the current value is too small, we cannot include it
if (run_length && data[offset] <= previous)
return find(data, total_length, offset+1, previous, run_length, max_length);
// otherwise, we want the best of either including it or not
return max(
// try including it
find(data, total_length, offset+1, data[offset], run_length+1, max_length),
// try excluding it
find(data, total_length, offset+1, previous, run_length, max_length));
}
// test
int main(int argc, char *argv) {
int data[] = { 88, 1, 22, 3, 34, 6, 54, 9, 19 };
printf("%d\n", find(data, 9, 0, 0, 0, 0));
return 0;
}
ovviamente questo è il codice terribile c (non perché non ho usato l'inizializzazione array, che qualcuno "gentilmente" fisso (anche se non si sono preoccupati di votare questo risposta - Immagino che ritengano di essere motivato a postare qui imparando dalla loro profonda conoscenza della sintassi C) ma perché usa lo stack di chiamate dove sarebbe più efficiente usare una struttura di memoria separata).
(anche, devo dire, scrivere qualcosa del genere è molto più facile come una funzione ricorsiva che come farlo in un ciclo, perché basta scrivere ciò che vuoi che succeda - se tu avessi un ciclo allora dovresti è necessario preoccuparsi di cambiare i valori e resettarli e tutto quel caos. Il problema è che abusa in modo orribile dello stack).
non riesco a vedere la relazione tra '88, 1, 22, 3, 34, 6, 54, 9, 19' e l'output atteso '1,3,6,9,19'. E cos'è '% d: 5'? Sono questi compiti? –
La sottosezione crescente più grande (non necessariamente contigua) –
... e probabilmente la lunghezza del sottotitolo –