Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione
Abbiamo provato per diverse settimane il nuovo Magic V5 di HONOR, uno smartphone pieghevole che ci ha davvero stupito. Il device è il più sottile (solo 4.1mm) ma non gli manca praticamente nulla. Potenza garantita dallo Snapdragon 8 Elite, fotocamere di ottima qualità e batteria in silicio-carbonio che garantisce un'ottima autonomia. E il Prezzo? Vi diciamo tutto nella nostra recensione completa.
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro)
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro)
Google Pixel 10 Pro XL è il top di gamma della serie Pixel, presentando un ampio display Super Actua da 6.8 pollici insieme alle novità della serie, fra cui la ricarica wireless magnetica Pixelsnap e le nuove funzionalità AI avanzate. Il comparto fotografico include un sistema a tripla fotocamera con zoom Pro Res fino a 100x, mentre il processore Tensor G5 con 16GB di RAM garantisce prestazioni percepite molto elevate su Android.
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico
Forte della piattaforma Qualcomm Snapdragon X, il notebook Lenovo IdeaPad Slim 3 riesce a coniugare caratteristiche tecniche interessanti ad uno chassis robusto, con autonomia di funzionamento a batteria che va ben oltre la tipica giornata di lavoro. Un notebook dal costo accessibile pensato per l'utilizzo domestico o in ufficio, soprattutto con applicazioni native per architettura ARM
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-12-2009, 19:24   #1
domenico88
Senior Member
 
L'Avatar di domenico88
 
Iscritto dal: Dec 2009
Messaggi: 1056
[C]minimo in un vettore

Ciao a tutti...
Allora ho un problemino con un esempio sulla ricorsione....

In pratica dovrei trovare il minimo nel vettore ricorsivamente, considerando l'elemento che occupa la prima posizione e i restanti elementi quindi first +1 - last.
Il funzionamento non lo riesco proprio a capire

Perdonatemi ma sono alle prime armi con la programmazione, soprattutto con la tecnica del divide et impera.....

Vi posto il codice della funzione

Codice:
 

int min_search_rec( int v[], int first, int last)
{ 
 int ris;
 
 /*Caso base */

 if ( first == last)
  return (first);

 /*Divide et impera*/
 
 ris = min_search_rec( v, first +1, last);

 /*Combina */
 
 if ( v[ris] < v[first] )
   return ris;
 else 
   return first;
}
Grazie anticipatamente a tutti!
domenico88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 08:31   #2
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Guarda fai così...
--caso base --> se indice == ultimo indice ritorni il minimo
--passo 1--> se elemento corrente minore di minimo allora minimo elemento corrente
--passo 2 --> passo ricorsivo richiami la funzione incrmentando l'indice e passando come parametro il nuovo minimo

dopo un po che ci hai ragionato su ti posto la soluzione ma non ora ovviamente
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 09:51   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Non ho capito cosa intendi per first e last. Mi immagino che sia l'intervallo di posizioni su cui andare a calcolare il minimo.

Condizione di arresto: va bene quella che hai scritto, però è errato il valore che ritorni. Non ha senso, anche nel resto della funzione, ritornare indietro indice e valori, o ritorni l'uno o ritorni l'altro. In questo caso deve sempre ritornare un valore del vettore.
Passo generico: se il valore corrente è minore di quello ritornato dal passo ricorsivo allora ritorni il valore corrente, altrimenti ritorni il valore del ritornato dal passo ricorsivo
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 09:57   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Inoltre di pende anche da come ti hanno insegnato il divide et impera. In teoria va bene anche solo incrementare first, ma molti per divide et impera intendono la suddivisione in due sottoinsiemi di dimensione simile dell'intervallo di azione della funzione ricorsiva.
Quindi dovresti suddividere a metà l'intervallo di ricerca e richiamare due volte la funzione ricorsiva. In questo caso il passo generico sarebbe:

divido l'intervallo first - last a metà, ne passo metà ad una funzione ricorsiva e una metà ad un'altra. Confronto il valore ritornato delle funzioni e ritorno il valore minore.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 12:06   #5
domenico88
Senior Member
 
L'Avatar di domenico88
 
Iscritto dal: Dec 2009
Messaggi: 1056
Grazie a tutti per le risp.....
Cmq raga quella funzione non l'ho scritta io, cioè l'ha scritta il mio prof sul mio libro di Asd.....

Ho capito poco e niente....scusate ma quando

ris = min_search(v, first +1, last); Cosa succede???

Non ho capito proprio come lavora la funzione

X clockover.....ci sto ragionando sarebbe una soluzione alternativa a quella del mio prof ma con una chiamata ricorsiva in coda giusto???
domenico88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 12:23   #6
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Allora quel codice che hai postato non funziona!
La chiamata ricorsiva che chiedi tu non fa altro che far avanzare l'indice first fino al caso base..

Comunque lascialo stare quello!
Fallo tu dal principio! Fattelo in due funzioni

1)
Codice:
int minimo(int a[], int dimensione_vettore){
    int index = 0;
    int min = a[index];
    return minimo2(a, min, index, dimensione_vettore);
}
2)
Codice:
int minimo2(.......){ fallo tu }
segui la traccia in linguaggio naturale che ti ho scritto nel primo post e cerca di capire che robaccia che fa

P.S.
ricorda che devi conoscere la dimensione del vettore

Ultima modifica di clockover : 23-12-2009 alle 12:26.
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 12:38   #7
domenico88
Senior Member
 
L'Avatar di domenico88
 
Iscritto dal: Dec 2009
Messaggi: 1056
Quote:
Originariamente inviato da clockover Guarda i messaggi
Allora quel codice che hai postato non funziona!
La chiamata ricorsiva che chiedi tu non fa altro che far avanzare l'indice first fino al caso base..

Comunque lascialo stare quello!
Fallo tu dal principio! Fattelo in due funzioni

1)
Codice:
int minimo(int a[], int dimensione_vettore){
    int index = 0;
    int min = a[index];
    return minimo2(a, min, index, dimensione_vettore);
}
2)
Codice:
int minimo2(.......){ fallo tu }
segui la traccia in linguaggio naturale che ti ho scritto nel primo post e cerca di capire che robaccia che fa

P.S.
ricorda che devi conoscere la dimensione del vettore



Graze clock.......ci provo.....
domenico88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 14:07   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Avevo letto male la funzione, quella funzione va perfettamente. Mi sembrava che ritornasse l'elemento del vettore, invece ritornava l'indice del valore minimo.

La chiamata di quella funzione dovrà essere:

min_index = min_search_rec(v, 0, size-1);

Ti permette di trovare il minimo inserendo qualsiasi intervallo, ad esempio:

min_index = min_search_rec(v, size-1, size-1);

Entrerai nella condizione di arresto e ti ritornerà l'indice dell'ultimo elemento del vettore. Questo è normale perché l'indice dell'elemento di minimo valore è sicuramente quello visto che è l'unico elemento valutato nell'intervallo.

Quindi pensa di chiamarlo così:

min_index = min_search_rec(v, size-2, size-1);

Verrà valutato il minimo fra gli ultimi due elementi del vettore:
- la condizione di arresto è falsa, quindi viene valutata la ricorsione che, come sopra, ritorna l'ultimo elemento del vettore
- a questo punto viene fatto il confronto fra l'ultimo elemento del vettore ed il penultimo, viene ritornato l'indice dell'elemento minore

Ora con:

min_index = min_search_rec(v, size-3, size-1);

Anche questa segue lo stesso ragionamento e ritorna l'indice dell'elemento minore fra gli ultime tre, andando a valutare l'elemento da ritornare fra gli indici dell'elemento size-3 e l'indice dell'elemento ritornato dalla chiamata ricorsiva.

Ultima modifica di cionci : 23-12-2009 alle 14:17.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 14:25   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da clockover Guarda i messaggi
Codice:
int minimo(int a[], int dimensione_vettore){
    int index = 0;
    int min = a[index];
    return minimo2(a, min, index, dimensione_vettore);
}
Non è necessario passare il minimo e nemmeno l'indice volendo, vedi questa:
Codice:
int indice_valore_minimo(int v[], int dim)
{
   int res;
   if(dim == 1)
      return 0;

   res = indice_valore_minimo(v, dim - 1);
   if(v[res] < v[dim - 1])
      return res;

   return dim -1;
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 15:08   #10
domenico88
Senior Member
 
L'Avatar di domenico88
 
Iscritto dal: Dec 2009
Messaggi: 1056
Sto confondendo un pò le idee .....
domenico88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 15:15   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da domenico88 Guarda i messaggi
Sto confondendo un pò le idee .....
La funzione va, basta che tu la provi o che tu segua il mio ragionamento con dei valori.
La cosa che almeno a me ha confuso è che non ritorna il minimo, ma l'indice del vettore che contiene il valore minimo.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 15:30   #12
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da cionci Guarda i messaggi
La cosa che almeno a me ha confuso è che non ritorna il minimo, ma l'indice del vettore che contiene il valore minimo.
Infatti.. comunque io l'ho fatto in questo modo
Codice:
int min(int a[], int size){
        int index = 0;
        int minimo = a[index];
        return min2(a, minimo, index+1, size);
}
int min2(int a[], int minimo, int i, int size){
        if(i == size)return minimo;
        if(a[i] < minimo)minimo = a[i];
        return min2(a, minimo, i+1, size);
}
poi ovviamente... se hai bisogno della posizione nel vettore è meglio usare quell'altro che hai postato, altrimenti se hai bisogno semplicemente del valore va bene anche il mio!

aivoglia in quanti modi si può fare
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 15:33   #13
domenico88
Senior Member
 
L'Avatar di domenico88
 
Iscritto dal: Dec 2009
Messaggi: 1056
grazie ragazzi siete stati davvero gentilissimi....
domenico88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 16:33   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da domenico88 Guarda i messaggi
grazie ragazzi siete stati davvero gentilissimi....
Ma hai almeno capito come funziona quello del professore ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 17:21   #15
domenico88
Senior Member
 
L'Avatar di domenico88
 
Iscritto dal: Dec 2009
Messaggi: 1056
Quote:
Originariamente inviato da cionci Guarda i messaggi
Ma hai almeno capito come funziona quello del professore ?
Hai colpito in pieno..... non ho capito ancora come funziona!

non riesco a capire i passi che compie la funzione sull'array!
domenico88 è offline   Rispondi citando il messaggio o parte di esso
Old 23-12-2009, 17:46   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da domenico88 Guarda i messaggi
Hai colpito in pieno..... non ho capito ancora come funziona!

non riesco a capire i passi che compie la funzione sull'array!
Hai letto il mio ragionamento ? Cosa non ti torna, commentalo passo per passo.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2009, 12:46   #17
domenico88
Senior Member
 
L'Avatar di domenico88
 
Iscritto dal: Dec 2009
Messaggi: 1056
Quote:
Originariamente inviato da cionci Guarda i messaggi
Hai letto il mio ragionamento ? Cosa non ti torna, commentalo passo per passo.
allora

Il caso base:

if( first == ultimo)
return first;

ok qui il caso base controlla che il vettore abbia esaurito gli elementi da controllare....in caso positivo ritorna il primo indice
Correggimi se sbaglio....


ris = min_search_ris(v, first +1, last);

Qua è il problema.....allora viene invocata la funzione con first che avanza di un elemento...ma cosa assegna la funzione a "ris"????
domenico88 è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2009, 12:59   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
E' spiegato nel mio messaggio sopra cosa ritrna ed in quale caso. Devi fare un ragionamento per induzione, altrimenti non ne esci.
Quota il mio messaggio, commenta ogni mio ragionamento e dimmi cosa non ti torna.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2009, 14:22   #19
domenico88
Senior Member
 
L'Avatar di domenico88
 
Iscritto dal: Dec 2009
Messaggi: 1056
non so veramente come fare per capire sta ricorsione

ma devo fare un ragionamento all'inverso?

ris = min_search(v, first +1, last);

dopo questa chiamata sul vettore cosa succede...sul libro c'è scritto che viene diviso considerando separatamente l'elemento che occupa la prima posizione (v[first] ) e il vettore v[first + 1....last] costituito dai rimanenti elementi....

l'ho riletto e strariletto il tuo ragionamento ma non riesco a capire!
domenico88 è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2009, 14:27   #20
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Prova fare una cosa: prendi un foglio di carta e creati, sempre sulla carta un array con 3 o 4 elementi massimo! Ti separi anche il foglio in 3 o 4 parti! Segui il codice su carta! Il tuo algoritmo parte e cominci a scrivere in uno spazio! Quando arrivi alla chiamata ricorsiva semplicemente cambi spazio e ricominci! Così via fino alla fine!
clockover è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Recensione Google Pixel 10 Pro XL: uno zoom 100x assurdo sempre in tasca (e molto altro) Recensione Google Pixel 10 Pro XL: uno zoom 100x...
Lenovo IdeaPad Slim 3: un notebook Snapdragon X economico Lenovo IdeaPad Slim 3: un notebook Snapdragon X ...
Recensione OnePlus Watch 3 43mm: lo smartwatch che mancava per i polsi più piccoli Recensione OnePlus Watch 3 43mm: lo smartwatch c...
BOOX Note Air4 C è uno spettacolo: il tablet E Ink con Android per lettura e scrittura BOOX Note Air4 C è uno spettacolo: il tab...
Roscosmos: RSC Energia smentisce la cris...
Da 309€ a 549€, fino a 32GB di RAM: ecco...
Beats mai così convenienti: sconti fino ...
Da 27,78€ a 56,99€: 5 accessori indispen...
3 minuti: è il tempo per vedere l...
Gli Amazfit sono ora gli smartwatch più ...
Rowenta alza la posta: scopa elettrica s...
6 robot per le pulizie completi in offer...
Friggitrice ad aria Cecofry Full InoxBla...
iPhone 16 Pro Max a 10€ in più del minim...
Una chiavetta USB, ma SanDisk Ultra Slid...
La bolla dell'AI: perché l'econom...
Lo smartphone dovrebbe essere usato solo...
SpaceX: i video e le foto dello spettaco...
Anche a Pescara si passa ai fatti: e-bik...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:44.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v