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.