Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile
Lenovo ha lanciato il ThinkTab X11 rimettendo piede nel segmento dei tablet Android con il marchio Think dopo oltre un decennio di assenza. Il risultato è un dispositivo che prende una direzione precisa: massima dotazione funzionale, costruzione resistente, autonomia fuori dagli schemi
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot
AMD Advancing AI è l'appuntamento annuale con il quale l'azienda americana mostra quelle che sono le proprie novità dal versante datacenter. Tra piattaforma Helios, GPU Instinct MI455X e processori EPYC di sesta generazione tutto quello che serve per processare l'IA sempre più complessa ed esigente
Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader
Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader
BOOX Go 6 Gen II porta per la prima volta il supporto allo stilo su un e-reader da 6 pollici, affiancando 3 GB di RAM al collaudato Snapdragon 665 e un design rivisto con scocca posteriore a costolature. Su carta la proposta è interessante, ma Android 11 fuori supporto, l'assenza di un alloggiamento per il pennino e un'autonomia ridotta rispetto agli e-reader tradizionali sono i compromessi da accettare
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-08-2007, 09:08   #1
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
[C] Ricorsione ordinamento vettore

Allora, devo scrivere una funzione che restituisca 1 se il vettore è ordinato in modo crescente, -1 se è ordinato im modo decrescente e 0 se gli elementi stanno a caso.

con la RICORSIONE

buttate giu qualche idea, intanto ci penso anc'ìhio
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:07   #2
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ho abbozzato questo ma non sembra avere molto senso

Codice HTML:
int ordinato(int vett[], int n){
                                
                                
                                if(n=1){return 0;}
                                
                                if(a[n-1]>a[n-2){return 1;}
                                
                                else return ordinato(int vett[], n-1);}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:13   #3
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Devi espandere un pochino il tema.
Per esempio, la tua funzione restituisce:
1 - se il vettore e' ordinato in modo crescente;
-1 - se il vettore e' ordinato in modo decrescente;
0 - se il vettore non e' ordinato;
-2 - se il vettore e' formato da elementi finora uguali.

il senso del risultato -2 e' che altrimenti non puoi stabilire l'ordine di vettori i cui primi elementi sono tutti uguali, ma dovrai rimandare la decisione fino a quando troverai un elemento diverso.

Usando questa considerazione, scriverai una funzione

int getOrder (int *vect, int n)

dove vect e' il tuo vettore ed n e' il numero di elementi ivi contenuti.
Potrai "giocare" con n al fine di ridurre la dimensione del vettore fino al/ai casi base.

BASE:
- se n <= 1 (quindi 0 o 1 elemento), ritornerai -2 (tutti elementi uguali, finora);
- se n == 2, ritornerai i corrispondenti confronti

PASSO RICORSIVO
- se n > 2, allora
- chiami ricorsivamente getOrder (vect, n-1).
Otterrai un risultato compreso fra {-1, 1, 0, -2};
- confronti gli elementi vect[n-2] e vect[n-1], ed il risultato lo confronti
con quanto riportato dalla chiamata ricorsiva.

C'est tout
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:23   #4
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ci provo
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:24   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
ci provo
Bene. Ho realizzato un piccolo codice per provare che funzionasse, se ti serve lo posto
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:27   #6
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ho provato a scrivere questo ma non so cosa ci va al posto di if(n==2)

Codice HTML:
int ordinamento(int vett[], int n){
                                   if(n<=1){
                                            return -2;}
                                   if(n==2){
                                            
                                            
                                   if(n>2){
                                           ordinamento(int vett[], int n-1);}
Non è per me la ricorsione, sono piu per le cose meccaniche
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:33   #7
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ciao,
anche il caso n > 2 deve essere controllato.

Comunque parliamo ora del caso n == 2. Io farei i confronti (tutti) fra gli unici due elementi che compongono il vettore:

- se vect[0] > vect[1] ritorna -1 (ordinato in modo decrescente)
- se vect[0] < vect[1] ritorna 1 (ordinato in modo crescente)
- se vect[0] == vect[1] ritorna -2 (vettore con tutti elementi uguali)

Ovviamente non hai il caso di vettore non ordinato, visto che contiene solo due elementi, i quali possono essere solo uguali o diversi fra loro e, se diversi, uno e' maggiore dell'altro
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:39   #8
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Codice HTML:
int ordinamento(int vett[], int n){
                                   if(n<=1){
                                            return -2;}
                                   if(n==2){
                                            if(vett[0]>vett[1]){return -1;}
                                            if(vett[0]<vett[1]){return 1;}
                                            if(vett[0]==vett[1]){return -2;}}
                                            
                                            
                                   if(n>2){
                                           ordinamento(int vett[], int n-1);}
Tipo così?

per se il vettore ha piu di 2 elementi devo richiamare direttamente la funzione con n-1 o cosa?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:43   #9
yorkeiser
Senior Member
 
L'Avatar di yorkeiser
 
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
http://it.wikipedia.org/wiki/Quicksort
__________________
Il sole è giallo
yorkeiser è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:45   #10
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
ma io non devo ordinare il vettore, devo controllare in che modo è ordinato
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:48   #11
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da xbubbax Guarda i messaggi
Codice HTML:
int ordinamento(int vett[], int n){
                                   if(n<=1){
                                            return -2;}
                                   if(n==2){
                                            if(vett[0]>vett[1]){return -1;}
                                            if(vett[0]<vett[1]){return 1;}
                                            if(vett[0]==vett[1]){return -2;}}
                                            
                                            
                                   if(n>2){
                                           ordinamento(int vett[], int n-1);}
Tipo così?

per se il vettore ha piu di 2 elementi devo richiamare direttamente la funzione con n-1 o cosa?
Si, tipo cosi'. Pero' potresti evitare quanto meno il confronto (vett[0] == vett[1]) mettendo un else o un return -2 secco.

Per quanto riguarda la parte n > 2, devi fare qualcosa di piu' articolato:

1 - ret = ordinamento (vett, n-1); // Controlli se il vettore con n-1 elementi e' in qualche modo ordinato
2 - se ((ret == 1 oppure ret == -2) AND // quindi il vettore precedente e' crescente o quasi
vett[n-2] <= vett[n-1]) // Anche l'ultimo elemento e' maggiore o uguale del precedente
allora
puoi ritornare 1, cioe' il vettore al passo n e' ordinato in maniera crescente.


Analogamente dovrai affrontare il caso in cui il vettore e' ordinato in maniera decrescente.

Piu' semplice e' il caso che il vettore al passo n-1 sia formato da elementi tutti uguali e che anche l'ultimo elemento sia uguale

Infine, il caso che il vettore al passo n-1 sia non ordinato e' banale: in tal caso e' non ordinato anche al passo n.
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:53   #12
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
piu o meno ho capito, ora faccio un altro esercizio e ci voglio riuscire da solo

grazie
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 10:59   #13
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Una soluzione può essere questa:
Codice:
int ordinato (int *arr, int len)
{
    int r = 0;

    if (len > 1)
        r = arr[0] <= arr[1] ? +1 : -1;

    if (len > 2 && ordinato (&arr[1], len-1) != r)
        r = 0;

    return r;
}
L'unico caso particolare è quello di un array con 1 elemento, in tal caso ritorna 0 (che in effetti non è nemmeno sbagliato ... non c'è ordine).
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:03   #14
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
Potete dare un occhiata a questo esercizio. E' una funzione iterativa che somma i numeri presenti in un testo. Mi da dei numeri enormi però il programma sembra giusto
Codice HTML:
#include <stdio.h>
#define SIZE 20
int somma_interi_nel_testo(char *stringa);

int main(){
           
           int somma=0;
           char stringa[SIZE];
           
           printf("Inserisci una stringa:\n");
           scanf("%s", &stringa);
           
           somma=somma_interi_nel_testo(stringa);
           
           printf("%d", somma);
           while(getchar() != '\n');
printf("Premere INVIO per continuare...");
getchar();
           }
           



int somma_interi_nel_testo(char *stringa){
                                          int somma=0;
                                          
                                          for(;*stringa='\0';*stringa++){
                                                               
                                          if(((*stringa)>=0)&&((*stringa)<=9)){
                                                                               somma += *stringa;}
                                                                               }}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:09   #15
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da andbin Guarda i messaggi
Una soluzione può essere questa:
Codice:
int ordinato (int *arr, int len)
{
    int r = 0;

    if (len > 1)
        r = arr[0] <= arr[1] ? +1 : -1;

    if (len > 2 && ordinato (&arr[1], len-1) != r)
        r = 0;

    return r;
}
L'unico caso particolare è quello di un array con 1 elemento, in tal caso ritorna 0 (che in effetti non è nemmeno sbagliato ... non c'è ordine).

Mi sembra che questo codice stabilisca se un vettore e' ordinato semplicemente confrontando i primi 2 elementi dello stesso....
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:19   #16
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Mi sembra che questo codice stabilisca se un vettore e' ordinato semplicemente confrontando i primi 2 elementi dello stesso....
Analizzalo meglio. Noterai che l'algoritmo che ho usato parte dal fondo dell'array e appena trova discordanza nell'ordine di 3 valori (A vs B e B vs C), ritorna 0 da lì in avanti (tornando indietro dalla ricorsione).
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:31   #17
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da andbin Guarda i messaggi
Analizzalo meglio. Noterai che l'algoritmo che ho usato parte dal fondo dell'array e appena trova discordanza nell'ordine di 3 valori (A vs B e B vs C), ritorna 0 da lì in avanti (tornando indietro dalla ricorsione).
Hai ragione.
Cmq ho provato a passare
{ 15, 10, 8, 7, 6, 5, 2, 2, 2, 2} e
{ 15, 10, 8, 7, 3, 3, 3, 3, 2, 1}
Mi ha detto, in entrambi i casi, che il vettore non e' ordinato... salvo errori miei, ovviamente
(cmq non penso sia un mio errore ma sia l'operatore ternario...)
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:34   #18
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
potete darmi un occhiata all'ultimo programma che ho postato?
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 11:47   #19
xbubbax
Senior Member
 
Iscritto dal: Apr 2007
Messaggi: 381
questa dovrebbe essere la versione ricorsiva(incompleta), ditemi almeno se sono sulla giusta strada

Codice HTML:
int somma_interi_nel_testo(char stringa[], int n){
                                                  
                                                  if(n==0){
                                                           return 
                                                  if((stringa[n]>=0)&&(stringa[n]<=9)){
                                                                                       return stringa[n]+somma_interi_nel_testo(stringa[n], n-1);} else return somma_interi_nel_testo(stringa[], n-1);}
xbubbax è offline   Rispondi citando il messaggio o parte di esso
Old 03-08-2007, 12:32   #20
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da sottovento Guarda i messaggi
Cmq ho provato a passare
{ 15, 10, 8, 7, 6, 5, 2, 2, 2, 2} e
{ 15, 10, 8, 7, 3, 3, 3, 3, 2, 1}
Mi ha detto, in entrambi i casi, che il vettore non e' ordinato...
Azz
Vero ... ma è un problema di concetto a cui non ho pensato subito. Avendo due valori adiacenti uguali, non si può stabilire alcunché sull'ordinamento, nel senso che dovrà essere il resto a determinarlo. In pratica, due valori uguali devono essere "bypassati".

Si dovrebbe aggiungere un quarto valore che indica appunto un "non so nulla dell'ordine".

Dovrebbe essere ok così:
Codice:
int ordinato (int *arr, int len)
{
    int r = -2, rr;

    if (len > 1)
        r = arr[0] < arr[1] ? +1 : arr[0] > arr[1] ? -1 : -2;

    if (len > 2)
    {
       rr = ordinato (&arr[1], len-1);

       if (r == -2)
           r = rr;
       else if (rr != -2 && r != rr)
           r = 0;
    }

    return r;
}
Se tutti i valori nell'array fossero uguali o se ci fosse 1 solo elemento, si otterrebbe alla fine -2.
È praticamente la ipotesi dei valori che facevi tu all'inizio.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot AMD Advancing AI 2026: l'hardware AMD per le ela...
Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader Tascabile e con Android: BOOX Go 6 Gen II &egrav...
Recensione Lenovo Idea Tab Plus: il tablet da 12 pollici che costa meno di 300 euro Recensione Lenovo Idea Tab Plus: il tablet da 12...
Oltre il contante e le crypto: tutto sull'Euro Digitale e la nuova sovranità monetaria europea Oltre il contante e le crypto: tutto sull'Euro D...
Batterie a terra per Varta, bancarotta v...
Elon Musk: l'intelligenza artificiale su...
Ryzen 7 9800HX3D: il miglior processore ...
Google porta Gemini Live sui vecchissimi...
Corsair Platform:4 in offerta: la scriva...
Il creatore di Disagea sull'addio dei gi...
Fastweb + Vodafone entra nello SmartCity...
AI Act europeo: dal 2 agosto partono i n...
Da 1,3 a 10 miliardi in due mesi: chi è ...
Schede video RTX: NVIDIA comunica nuovi ...
GTA 6, i 60 fps stabili potrebbero esser...
Questa Smart TV QLED da 40 pollici con H...
Ring in sconto fino al 57%: videocitofon...
Pubblicità su Windows con i monit...
Azioni sul PC e coding solo chiedendo: O...
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: 19:52.


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