Faccio un esempio pratico. Ho scritto del codice in C++ che memorizza nei vettori "lunghezze" e "partenze" le lunghezze e le posizioni di partenza di tutte le possibili sequenze crescenti di elementi consecutivi presenti in un vettore. 
Mi sono approcciato al problema in due modi diversi e ho prodotto 2 codici diversi che danno gli stessi risultati. Qual è meglio e che strada devo seguire per gli esercizi futuri?
1)
In questo caso ragiono analizzando una coppia, poi passo alla successiva e così via. 
#include <iostream>
#include<cstdlib>
#define nmax 100
using namespace std;
void leggi_vettore(int dim,int V[])
{
    for(int i=0;i<dim;i++)
    {
        cout<<"\nInserisci l'elemento "<<i+1<<" ";
        cin>>V[i];
    }
}
void stampa_vettore(int dim,int V[])
{
    for(int i=0;i<dim;i++)
    {
        cout<<"  "<<V[i];
    }
}
int main()
{
    int V[nmax];
    cout<<"Scegli dimensione V1 ";
    int dim;
    cin>>dim;
    leggi_vettore(dim,V);
    cout<<"\nV = ";
    stampa_vettore(dim,V);
    int progressione=-1;
    int partenze[nmax];
    int par;
    int lunghezze[nmax];
    int lung;
    for(int k=0;k<dim-1;k++)    
    {
        par=k+1;
        lung=1;
        for(int j=k;j<dim-1;j++)
        {
            if(V[j]<V[j+1])
            {
                ++progressione;
                partenze[progressione]=par;
                lunghezze[progressione]=++lung;
            }
            else
            {
                par=j+2;
                lung=1;
            }
        }    
    }
    cout<<"\n";
    stampa_vettore(progressione+1,partenze);
    cout<<"\n";
    stampa_vettore(progressione+1,lunghezze);
}
2)
In questo caso ragiono non passo passo ma analizzando a priori tutte le possibili situazioni che possono capitare. Cioè dico al calcolatore "se il precedente è < del successivo per tutti gli elementi, memorizza una sequenza lunga dim e che parte da 1, se il precedente è < del successivo per tutti gli elementi tranne l'ultimo, memorizza una sequenza lunga dim-1 e che parte da 1..........se solo il primo è < del secondo, memorizza una sequenza che parte da 1 lunga 2 e cosi via.
#include <iostream>
#include<cstdlib>
#define nmax 100
using namespace std;
void leggi_vettore(int dim,int V[])
{
    for(int i=0;i<dim;i++)
    {
        cout<<"\nInserisci l'elemento "<<i+1<<" ";
        cin>>V[i];
    }
}
void stampa_vettore(int dim,int V[])
{
    for(int i=0;i<dim;i++)
    {
        cout<<"  "<<V[i];
    }
}
int main()
{
    int V[nmax];
    cout<<"Scegli dimensione V ";
    int dim;
    cin>>dim;
    leggi_vettore(dim,V);
    cout<<"\nV = ";
    stampa_vettore(dim,V);
   int j;
    int lunghezze[nmax];
    int partenze[nmax];
    int progressione=-1;
    for(int i=0;i<dim-1;i++)
    {
       for(int k=dim-1;k>i;k--)
       {
           j=i;
           while(j<k)
           {
               if(V[j]<V[j+1])
               {
                   ++j;
               }
               else
                   break;
           }
           if(j==k)
           {
               ++progressione;
               partenze[progressione]=i+1; lunghezze[progressione]=k-i+1;
           }
       }
    }
}
Ho l'impressione che il secondo sia poco efficiente e faccia fare al calcolatore passaggi inutili.