PDA

View Full Version : [C++] Elemento massimo di un vettore ricorsivamente


xbubbax
12-10-2007, 10:07
Non capisco perchè non funziona questo programma che calcola ricorsivamente il massimo elemento di un vettore

#include <iostream>

using namespace std;

int massimo(int v[], int n, int& max){
if(n>0){
if(v[n-1]>max){
max=v[n-1];
return massimo(v,n,max);}
else return massimo(v,n,max);}
else return max;}

main(){

int max=0;
int i;
cin >>i;
int* v = new int v[i];

for(int j=0;j<i;j++){
cin >> v[i];}

cout << massimo(v, i);

system ("pause");}

tomminno
12-10-2007, 10:23
#include <iostream>

using namespace std;

int massimo(int v[], int n, int& max){
if(n>0){
if(v[n-1]>max){
max=v[n-1];
return massimo(v,n,max);}
else return massimo(v,n,max);}
else return max;}

main(){

int max=0;
int i;
cin >>i;
int* v = new int v[i];

for(int j=0;j<i;j++){
cin >> v[i];}

cout << massimo(v, i);

system ("pause");}

A parte l'errore nella riga

cout << massimo(v, i);

che dovrebbe essere

cout << massimo(v, i, max);


nella funzione ricorsiva passi sempre il valore di n, mai n-1. Oltretutto mi sembra inutile fare:

if(v[n-1]>max){
...
return massimo(v,n,max);}
else
return massimo(v,n,max);}


Secondo me volendo seguire la tua traccia dovresti fare

int massimo(int v[], int n, int& max)
{
if(n>0)
{
if(v[n-1]>max)
max=v[n-1];
return massimo(v,n-1,max);
}
return max;
}


[EDIT] Non avevo letto il ricorsivamente nel titolo, la parte sotto può essere ignorata

Usando un pò di C++ per trovare il massimo di un vettore io farei così:


#include <algorithm>
#include <vector>
#include <iostream>

class MaxVector
{
public:
MaxVector() : max(0xFFFFFFFF) {}
void operator() (int value)
{
if (value>max)
max = value;
}
int GetMax() { return max; }
private:
int max;
};

...
vector<int> v;
...
int val = 0;
cin >> val;
v.push_back(val);
...
MaxVector v = for_each(v.begin(), v.end(), MaxVector());
int max = v.GetMax();
...

xbubbax
12-10-2007, 10:36
#include <iostream>

using namespace std;

int massimo(int v[], int n, int& max)
{
if(n>0)
{
if(v[n-1]>max)
max=v[n-1];
return massimo(v,n-1,max);
}
return max;
}

main(){

int max=0;
int i;
cin >>i;
int* v = new int v[i];

for(int j=0;j<i;j++){
cin >> v[i];}

cout << massimo(v, i, max);

system ("pause");}


Non funziona lo stesso, mi da errore su questa riga int* v = new int v[i];21 expected `,' or `;' before "v"



comq le classi ancora non le ho fatte

cionci
12-10-2007, 11:10
xubbax: di nuovo con questa indentazione ?
Ti invito ad usare una indentazione standard quando posti problemi in questa sezione. Lo capisci che così facendo costringi chi legge il tuo codice a copiarlo, metterlo in un editor e applicare l'indentazione prima di risponderti ?
Fallo almeno come forma di rispetto per chi legge il tuo codice.

xbubbax
12-10-2007, 11:11
guarda che non lo faccio mica apposta.. sono abituato cosi

isAlreadyInUse
12-10-2007, 11:12
E sei abituato male :D

xbubbax
12-10-2007, 11:18
e lo so, ma mica posso aspettare di identare benissimo per scrivere una cosa sul forum

isAlreadyInUse
12-10-2007, 11:21
Per quelle 4 righe potevi fare lo sforzo

xbubbax
12-10-2007, 11:22
ma per me quello è identato benissimo, non capisco cosa c'è che non va, per me è leggibilissimo

cionci
12-10-2007, 11:30
guarda che non lo faccio mica apposta.. sono abituato cosi
Disabituati...cambia le tue abitudini. In queste cose essere originali è solo dannoso. Inoltre se un giorno farai un progetto in C++ in collaborazione con altre persone sarai comunque costretto a cambiare le tue abitudini.

Almeno prima di postare il codice qui passalo da un indentatore automatico ;)

cionci
12-10-2007, 11:38
Cosa c'è che non va nel tuo modo di indentare ormai te l'ho già detto diverse volte.

Ad ogni modo per calcolare il max in maniera ricorsiva farei così:

int getMax(int v[],int n){if(n>1){int prevMax=getMax(v,n-1);return (prevMax>v[n-1])?prevMax:v[n-1];}return v[0];}

isAlreadyInUse
12-10-2007, 11:40
Non ci indurre in indentazione amen :O

tomminno
12-10-2007, 12:05
[HTML]
Non funziona lo stesso, mi da errore su questa riga int* v = new int v[i];21 expected `,' or `;' before "v"

comq le classi ancora non le ho fatte

Mi era sfuggito:

int * v = new int[i];


già che ci sei, per buona abitudine, io metterei anche una delete prima dell'uscita dal main.

_Claudio
12-10-2007, 14:46
Spero bene che il problema sia un problema didattico...
Perchè risolvere un problema di complessità n con la ricorsione è come usare un transatlantico per attraversare un fiume...

Furla
13-10-2007, 09:57
int max(int* v, int n)
{
if (n==1) return *v;
return *v>(n=max(v+1,n-1))?*v:n;
}


impara ad indentare, nel main l'indice del ciclo è j.