DOMANDA Programmi con ricorsione C++

Pubblicità
Hai cercato prima su google? Pare che il problema sia che name.exe sia ancora attivo, uccidilo dal task manager e riprova (magari chiudi e riapri codeblocks, male non fa)
 
Ho solo letto i quesiti, ma non ho visto la possibilità di usare ricorsione (almeno non intesa come "richiamo della stessa funzione più volte")
1) si risolve con:
1.1)dichiaro una variabile risultato
1.2) la azzero (unibile a 1.1)
1.3) for da 0 a n, escluso usando la variabile X a passi di 1 (la cosa spero abbia senso e potrebbe essere questa la ricorsione, anche se la chiamo iterazione)
1.3.1) risultato=risultato+2*X+1
1.4) ritorno risultato

2) del tutto simile alla prima, tranne che
2.3) for da 1 a n, escluso usando la variabile X a passi di 1 (la cosa spero abbia senso e potrebbe essere questa la ricorsione, anche se la chiamo iterazione)
2.3.1) risultato=risultato+n
--- i due messaggi sono stati uniti ---
3) si risolve con
3.1) creo una variabile intera
3.2) le assegno il valore della lunghezza della stringa
3.3) creo una boolean risultato
3.4) la rendo vera
3.5) creo una variabile X
3.6) la azzero
3.7) fino a che lunghezza stringa é maggiore di (X*2)
3.7.1) creobuna boolean Y
3.7.2) verifico che l'X esimo elemento sia uguale al lunghezza-X esimo (NON é una condizione, ma il valore dell'uguaglianza) e assegno il valore dell'uguaglianza a Y
3.7.3) risultato=risultato*Y
3.7.4) X=X+1
3.8) ritorno risultato

NON so se va bene, ma dovrebbe andare, comunque non mi sembra sbagliata
 
Ultima modifica:
if (n=0):suicidio:

Si qui dimenticanza ma non va ancora.. ho risloto il problema di priva cambiando directory di salvataggio ma non vine il risultato giusto..
Codice:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>

using namespace std;


int somma(int A[], int n)
{if (n==0)
return 0;
else
return A[n-1] + somma (A, n-1);
}

int main()
{
int n;
cin>>n;
int A[n];
cin>>A[n];
cout<<somma(A, n);
}
--- i due messaggi sono stati uniti ---
Cosi' va, non riesco a farlo con il cin n e cin A[n] nel main come sopra non capisco l'errore...

Codice:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>

using namespace std;


int somma(int A[], int n)
{if (n<=0)
return 0;
else
return A[n-1] + somma (A, n-1);
}

int main()
{

int A[6] = {1, 2, 3, 4, 5,6};
int n=6;
cout<<somma(A, n);
}
--- i due messaggi sono stati uniti ---
Come capirete mi sto allenando sulla ricorsione anche questo non mi va mi da' sempre false (cioè 0..) (output TRUE se ci sono elementi >10 nell'array)

Codice:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>

using namespace std;


bool tutti(int A[], int n)
{if (n<=10)
  return false;
else
return tutti (A,n-1);
}

int main()
{
int A[6] = {11, 21, 101, 41, 51,61};
int n=6;

cout<<tutti(A, n);
}
 
Ultima modifica:
Cosi' va, non riesco a farlo con il cin n e cin A[n] nel main come sopra non capisco l'errore...

Ma per forza non riesci a fare questo, non ha molto senso...

C++:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>

using namespace std;


int somma(int A[], int n)
{
  if (n==0)
    return 0;
  else
    return A[n-1] + somma (A, n-1);
}

int main()
{
  int n;
  cin>>n;
  int A[n];
  cin>>A[n];
  cout<<somma(A, n);
}

Ormai dovresti sapere come funzionano gli array, comunque...
Stai leggendo in input n e dichiari l'array A di quella dimensione; tuttavia questo array, che è allocato staticamente sullo stack, avrà al suo interno valori "sporchi". Poi assegni alla posizione A[n] il valore letto in input, cosa che non ha molto senso, in quanto quell'indice è fuori dal range dell'array.
Come risultato vedrai sempre numeri "a caso", e quasi certamente piuttosto alti.
Tu dovresti fare un for e richiedere gli N numeri che andrai ad inserire nell'array.

C++:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>

using namespace std;

bool tutti(int A[], int n)
{
  if (n<=10)
    return false;
  else
    return tutti (A,n-1);
}

int main()
{
  int A[6] = {11, 21, 101, 41, 51,61};
  int n=6;
  cout<<tutti(A, n);
}

Questo torna false subito in quanto (posto che non ho capito bene cosa vorresti ottenere) n è minore di 10, e quindi entra subito nell'if.
 
in questo dovrei avere TRUE se tutti gli elementi sono >10 oppure False.
Cambiato cosi' ma sempre 0....

C++:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>

using namespace std;

bool tutti(int A[], int n)
{
  if (A[n]<=10)
    return false;
  else
    return tutti (A,n-1);
}

int main()
{
  int A[6] = {11, 21, 101, 41, 51,61};
  int n=6;
  cout<<tutti(A, n);
}
--- i due messaggi sono stati uniti ---

Per il discorso cin e cout esercizio sopra risolvo cosi':

C++:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>

using namespace std;


int somma(int A[], int n)
{if (n==0)
return 0;
else
return A[n-1] + somma (A, n-1);
}

int main()
{

  int n=7;
  int A[n];
  for(int i=0; i<n; i++)
  {
    cin>>A[i];
  }

cout<<somma(A, n);
}
 
Ultima modifica:
Questo ricorsivo non ha molto senso come esercizio.
Comunque stai sbagliando proprio il caso base e la chiamata ricorsiva; non torna mai true quello.

Devi restituire true se tutti gli elementi sono maggiori di 10 (questo implica dover guardare tutti i valori), e false non appena ne trovi anche solo uno che non rispetta il criterio.
Anche il controllo che fai su A[n] non è corretto: nella prima iterazione varrà quanto la dimensione dell'array, e quindi, come nel precedente esercizio, andrebbe a verificare una posizione fuori dai limiti.

Come lo cambieresti? Non voglio darti subito la soluzione, ti suggerisco solo che l'if che utilizzi è corretto (a parte l'indice sbagliato), ma che ne manca un altro (che torni true).
 
Questo ricorsivo non ha molto senso come esercizio.
Comunque stai sbagliando proprio il caso base e la chiamata ricorsiva; non torna mai true quello.

Devi restituire true se tutti gli elementi sono maggiori di 10 (questo implica dover guardare tutti i valori), e false non appena ne trovi anche solo uno che non rispetta il criterio.
Anche il controllo che fai su A[n] non è corretto: nella prima iterazione varrà quanto la dimensione dell'array, e quindi, come nel precedente esercizio, andrebbe a verificare una posizione fuori dai limiti.

Come lo cambieresti? Non voglio darti subito la soluzione, ti suggerisco solo che l'if che utilizzi è corretto (a parte l'indice sbagliato), ma che ne manca un altro (che torni true).

Per questa volta puoi scrivermi il codice corretto?
Ora sono un po' fuso sono due giorni che faccio informatica e non riesco ora piu' a connettere, devo mettermi su scienze e fisica, se per favore ripeto puoi correggerlo perchè ora come ora potrei stare li' tutto il pomeriggio ma non ho piu' la testa per informatica....
 
E' meglio se ci provi comunque, sono due righe in croce...
Se ti perdi nei ragionamenti chiedi, se non è chiaro qualcosa anche, approfittane. Vale sempre il discorso delle volte precedenti.
Stacca dal problema se non riesci ora. Cosa ti sta bloccando?
 
Hai ragione ma non ci arrivo scusami non sempre è banale quello che per te è banale credimi, la soluzione sarà anche elementare ma non ci arrivo, come ben sai non sono un "mostro" e in questo thread alla fine ho cercato le soluzioni anche tramite vostre indicazioni senza avere la soluzione già fatta giustamente , ma per questo esercizio ti chiedo cortesemente se puoi scrivermi esattamente come va fatto.
 
:deserto:

C++:
bool tutti(int A[], int n)
{
  if(n <= 0)
    return true;
  
  if (A[n-1] <= 10)
    return false;

  return tutti(A, n-1);
}

un possibile modo è quello sopra riportato.
Se vuoi spiegazioni, chiedi pure.
 
Ho fatto anche il minimo e il massimo in un array:

C++:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>

using namespace std;


  if (n == 1)
    return A[0];
    return min(A[n-1], minimo(A, n-1));
}

int main()
{
    int A[] = {1, 4, 45, 6, -50, 10, 2};
    int n=7;
      cout <<  minimo(A, n);
    return 0;
}

C++:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>

using namespace std;


  if (n == 1)
    return A[0];
    return min(A[n-1], minimo(A, n-1));
}
int massimo(int A[], int n)
{
      if (n == 1)
        return A[0];
    return max(A[n-1], massimo(A, n-1));
}

int main()
{
    int A[] = {1, 4, 45, 6, -50, 10, 2};
    int n=7;
    cout <<  massimo(A, n);
    return 0;
}
ho visto che si puo' usare min e max (che non avevo mai usato) ma pero' in un forum ho visto che al posto di
if (n == 1)
return A[0];
usano
if (n == 0)
return A[0];
qual'è la soluzione giusta?
--- i due messaggi sono stati uniti ---
:deserto:

C++:
bool tutti(int A[], int n)
{
  if(n <= 0)
    return true;
 
  if (A[n-1] <= 10)
    return false;

  return tutti(A, n-1);
}

un possibile modo è quello sopra riportato.
Se vuoi spiegazioni, chiedi pure.

Scusa non ho capito bene questo
if(n <= 0)
return true
 
ho visto che si puo' usare min e max (che non avevo mai usato) ma pero' in un forum ho visto che al posto di
if (n == 1)
return A[0];
usano
if (n == 0)
return A[0];
qual'è la soluzione giusta?

Com'è il codice completo che hai visto?
Molto probabilmente viene passato l'indice sottraendo una unità nella prima chiamata alla funzione.

Scusa non ho capito bene questo
if(n <= 0)
return true

Se scorri tutto l'array sino a quando non ha più elementi, e quindi giungi all'ultima posizione, sei sicuro che la condizione sia rispettata, e quindi restituisci true.
 
Com'è il codice completo che hai visto?
Molto probabilmente viene passato l'indice sottraendo una unità nella prima chiamata alla funzione.
Avevo visto questo, ma il corretto nel mio caso è l'altro?

Codice:
int findmin(const int a[], int n) {
   if (n == 0) // base case
      return a[0];

   return a[n] < (int min = findmin(a, n - 1)) ? a[n] : min;
}
 
Si, nel tuo caso si. Per lui ad ogni chiamata l'elemento corrente è a[n], nel tuo caso è a[n-1].
Tra i due preferisco utilizzare n e non n-1; comunque il risultato è il medesimo.
 
Pubblicità
Pubblicità
Indietro
Top