DOMANDA Programmi con ricorsione C++

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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)
 

Zeus Giove

Nuovo Utente
21
11
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
Post unito automaticamente:

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:

_Achille

Utente Èlite
3,067
725
CPU
Intel i5-6600K @4.6 GHz
Dissipatore
Cryorig H5
Scheda Madre
ASRock Z170 Extreme 6
HDD
WesternDigital 1TB & Crucial MX200 250GB
RAM
Corsair Ven 16GB DDR4 2133MHz
GPU
Sapphire RX 580 Nitro+
Monitor
Dell S2418H
PSU
RM550X
Case
NZXT S340
Periferiche
Anne Pro 2, Razer Abyssus
OS
Windows 10 Pro
if (n=0):suicidio:
 

MPG

Utente Attivo
544
4
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);
}
Post unito automaticamente:

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);
}
Post unito automaticamente:

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:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 
  • Mi piace
Reazioni: MPG

MPG

Utente Attivo
544
4
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);
}
Post unito automaticamente:


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:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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).
 

MPG

Utente Attivo
544
4
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....
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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?
 

MPG

Utente Attivo
544
4
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.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
: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.
 

MPG

Utente Attivo
544
4
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?
Post unito automaticamente:

: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
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 
  • Mi piace
Reazioni: MPG

MPG

Utente Attivo
544
4
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;
}
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili