Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-05-2006, 15:20   #1
white05
Member
 
Iscritto dal: May 2005
Messaggi: 249
[c] ricorsione

Come trovare il minimo di un array 1D con metodo ricorsivo?
Ho provato varie strade ma credo di essere giunto a qualche cosa di troppo complesso! Deve esserci sicuramente un metodo MOLTO più facile!
white05 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 15:25   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da white05
Come trovare il minimo di un array 1D con metodo ricorsivo?
Ho provato varie strade ma credo di essere giunto a qualche cosa di troppo complesso! Deve esserci sicuramente un metodo MOLTO più facile!
Scusa... perché usare la ricorsione quando basta un semplice ciclo for??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 16:02   #3
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da white05
Come trovare il minimo di un array 1D con metodo ricorsivo?
Ho provato varie strade ma credo di essere giunto a qualche cosa di troppo complesso! Deve esserci sicuramente un metodo MOLTO più facile!
qualcosa del genere:
Codice:
int array_min( int* data, int length )
{
  return rec_min( data[0], data+1, length -1);
}

int rec_min( int x, int* data, int length )
{
  if (length == 0 )
    return x;
  x = min(x,data[0])
  return rec_min( x , data+1, length-1);
}
Che tra l'altro dovrebbe risultare tail-recursive.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 16:16   #4
white05
Member
 
Iscritto dal: May 2005
Messaggi: 249
Quote:
Scusa... perché usare la ricorsione quando basta un semplice ciclo for??
perché purtroppo quando le persone incompetenti chiedono di realizzare qualche cosa per dei corsi non si rendono conto che così non insegnano a programmare ma confondono solo le idee....

Quote:
Che tra l'altro dovrebbe risultare tail-recursive.
tail-recursive significa???

Pensa che in realtà si dovrebbe creare una ricerca di minimo con ricorsione e approccio divide et impera...
assurdo da un punto di vista della logica della programmazione
white05 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 16:59   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da white05
tail-recursive significa???
che si converte in un algoritmo iterativo con estrema naturalezza e semplicità

Quote:
Pensa che in realtà si dovrebbe creare una ricerca di minimo con ricorsione e approccio divide et impera...
prova questa porcheria ma non ti fidare troppo, l'ho scritta in 2 secondi senza manco provare
Codice:
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define F FunzioneTotalmenteImbecille

int FunzioneTotalmenteImbecille(int *Array, int Start, int End) {
    if (End == Start) {
        return Array[Start];
    }
    return MIN(F(Array, Start, Start + (End - Start) / 2),
        F(Array, Start + (End - Start) / 2 + 1, End));
}
Quote:
assurdo da un punto di vista della logica della programmazione
concordo, e sono sinceramente contento per te che tu l'abbia capito: vuol dire che nonostante le assurde richieste dei professori, se gli studenti ci mettono del loro alla fine qualcosa in termini di preparazione la guadagnano lo stesso. intendiamoci, ovviamente sarebbe tutto più facile se i professori evitassero di andare controcorrente...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 17:02   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ma perché non chiedi al tuo prof di farvi fare algoritmi che meritino realmente un approccio divide et impera? come ad esempio uno dei tanti algoritmi di ordinamento... -_-'
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 18:17   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da white05
perché purtroppo quando le persone incompetenti chiedono di realizzare qualche cosa per dei corsi non si rendono conto che così non insegnano a programmare ma confondono solo le idee....
Purtroppo non posso fare altro che quotare quanto appena detto. Direi volentieri qualcos'altro sui professori ... ma è meglio se non lo faccio.


Ah, per il minimo di un array ci ho provato anche io. Ecco la "mia" soluzione:
Codice:
int int_array_min (int *arr, int length)
{
    int min = *arr;

    if (length > 1)
        min = int_array_min (arr+1, length-1);

    return *arr < min ? *arr : min;
}

int main (void)
{
    int a[4] = { 12, 5, 7, 20 };
    int min;

    min = int_array_min (a, 4);

    return 0;
}
Non l'ho provata al 100% ma credo che sia ok.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 20:37   #8
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da 71104
ma perché non chiedi al tuo prof di farvi fare algoritmi che meritino realmente un approccio divide et impera? come ad esempio uno dei tanti algoritmi di ordinamento... -_-'
e vero, ma è l'unico modo per forzare gli studenti a provare la programmazione ricorsiva.

anche se sarebbe meglio impararla su un linguaccio funzionale(io ho imparato su schema, e anche io all'epoca lo odiavo...)
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 21:38   #9
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da 71104
che si converte in un algoritmo iterativo con estrema naturalezza e semplicità


prova questa porcheria ma non ti fidare troppo, l'ho scritta in 2 secondi senza manco provare
Codice:
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define F FunzioneTotalmenteImbecille

int FunzioneTotalmenteImbecille(int *Array, int Start, int End) {
    if (End == Start) {
        return Array[Start];
    }
    return MIN(F(Array, Start, Start + (End - Start) / 2),
        F(Array, Start + (End - Start) / 2 + 1, End));
}
concordo, e sono sinceramente contento per te che tu l'abbia capito: vuol dire che nonostante le assurde richieste dei professori, se gli studenti ci mettono del loro alla fine qualcosa in termini di preparazione la guadagnano lo stesso. intendiamoci, ovviamente sarebbe tutto più facile se i professori evitassero di andare controcorrente...

L'approccio divide et impera qua non ti serve, l'array non è ordinato e devi *comunque* passare in rassegna tutti gli elementi . Se fai un paio di conti vedrai che all'incirca fai lo stesso numero di confronti. A voler essere pignoli, in questo modo accedi "a saltoni" alla memoria, col probabile risultato di rallentare l'afflusso dei dati alla cpu (soprattutto se l'array è piu' grande della cache del processore).
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 21:47   #10
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da thebol
e vero, ma è l'unico modo per forzare gli studenti a provare la programmazione ricorsiva.

anche se sarebbe meglio impararla su un linguaccio funzionale(io ho imparato su schema, e anche io all'epoca lo odiavo...)
Concordo, una volta assimilata la ricorsione diventa piu' naturale e pure semplice da capire.
In questo caso pero' l'esempio non è dei migliori ([i]grazie[(i] anche alla scelta del C come linguaggio).
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 27-05-2006, 22:50   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da marco.r

L'approccio divide et impera qua non ti serve, [...]
l'ha detto lui che serve, è una richiesta dell'esercizio
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 02:06   #12
il_luridone
Member
 
L'Avatar di il_luridone
 
Iscritto dal: Oct 2004
Città: Bologna
Messaggi: 50
io risolverei così
Codice:
int
minimo (int *input, int p, int r)
{
  int q;     /* mediano attorno il quale dividiamo l'array */

  if ((r - p) > 0)
    {
      q = floor ((r - p) / 2);
      return MIN (minimo (input, p, p + q), minimo (input, p + q + 1, r));
    }
  else
    return input[p];
}
input è l'array di interi, p e r sono gli indici del primo e dell'ultimo elemento. Per esempio, se hai un array con tre interi, hai p = 0 e r = 2.

Se r - p > 0 allora hai più di un elemento nell'array e hai bisogno di spezzare il problema: q è il mediano inferiore dell'array e le due parti vengono passate a due chiamate ricorsive della funzione.

Se r - p == 0 allora l'array ha un solo elemento, che è banalmente il minimo dell'array.

Quando le ricorsioni spezzettano i sottoproblemi fino ad arrivare ad array di un elemento, la ricorsione finisce e i numeri ritornati vengono confrontati dalla macro MIN
Codice:
#define     MIN(x,y)     ((x) < (y) ? (x) : (y))
che non è altro che un condizionale per selezionare il numero minore.

Questo è un semplice codice di test, se lo intitoli "min_ricorsivo.c" lo puoi compilare con "gcc -Wall -ansi -pedantic -lm -o min_ricorsivo min_ricorsivo.c"
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


#define     MIN(x,y)     ((x) < (y) ? (x) : (y))


int
minimo (int *input, int p, int r)
{
  int q;

  if ((r - p) > 0)
    {
      q = floor ((r - p) / 2);
      return MIN (minimo (input, p, p + q), minimo (input, p + q + 1, r));
    }
  else
    return input[p];
}


int
main (int argc, char **argv)
{
  int i;
  int *input;

  input = (int *) malloc ((argc - 1) * sizeof (int));
  if (input == NULL)
    {
      perror ("errore malloc");
      exit (1);
    }


  if (argc == 1)
    {
      printf ("uso: min_ricorsivo <numeri interi>\n");
      printf ("i numeri interi devono essere separati da spazi.\n");
      exit (1);
    }

  for (i = 1; i < argc; i++)
    {
      input [i-1] = strtol(argv[i], (char **)NULL, 10);
      printf ("%d ", input [i - 1]);
    }

  printf ("\n");

  printf ("min = %d\n", minimo(input, 0, argc - 2));

  return 0;
}
Metti qualche numero come argomento a linea di comando e dovrebbe sputare il minimo. Per capire bene cosa succede aiuta sicuramente disegnare l'array di input su un foglio ed eseguire il programma passo passo con un debugger, controllando tutti i valori delle variabili e aggiornando di conseguenza il disegno.

Spero vada bene, l'ora è quella che è
__________________
And the salad is frightful!
I have an important message to deliver to all the cute people all over the world. If you're out there and you're cute, maybe you're beautiful. I just want to tell you something: there's more of us ugly mother-fuckers than you are, hey-y, so watch out.
il_luridone è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 10:37   #13
sars
Junior Member
 
Iscritto dal: May 2006
Messaggi: 5
Quote:
Originariamente inviato da white05
perché purtroppo quando le persone incompetenti chiedono di realizzare qualche cosa per dei corsi non si rendono conto che così non insegnano a programmare ma confondono solo le idee....



tail-recursive significa???
Significa che l'ultima istruzione della funzione e` la chiamata ricorsiva. Molti compilatori di linguaggi funzionali possono usarla per ottimizzare l'uso dello stack (non credo che ci siano compilatori c che lo fanno)

Quote:
Pensa che in realtà si dovrebbe creare una ricerca di minimo con ricorsione e approccio divide et impera...
assurdo da un punto di vista della logica della programmazione
Delirio puro.
(primo post: saluti a tutti!)
sars è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 10:52   #14
sars
Junior Member
 
Iscritto dal: May 2006
Messaggi: 5
Quote:
Originariamente inviato da marco.r
Concordo, una volta assimilata la ricorsione diventa piu' naturale e pure semplice da capire.
In questo caso pero' l'esempio non è dei migliori ([i]grazie[(i] anche alla scelta del C come linguaggio).
Comunque anche con un linguaggio funzionale nessuno userebbe mai la ricorsione per cercare il minimo in un vettore, in lisp:

Codice:
(reduce #'min array)
sars è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 12:12   #15
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da 71104
l'ha detto lui che serve, è una richiesta dell'esercizio
Chiedo scusa, non l'avevo capito
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 12:23   #16
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da sars
Comunque anche con un linguaggio funzionale nessuno userebbe mai la ricorsione per cercare il minimo in un vettore, in lisp:

Codice:
(reduce #'min array)
Sicuro, se non altro perchè abbiamo funzioni di piu' alto livello già pronte . Il mio discorso era che, volendo scriversela, di solito la versione ricorsiva riesce ad essere piu' elegante e chiara della corrispondente iterativa, ma in questo caso è il contrario.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 12:48   #17
sars
Junior Member
 
Iscritto dal: May 2006
Messaggi: 5
Quote:
Originariamente inviato da marco.r
Il mio discorso era che, volendo scriversela, di solito la versione ricorsiva riesce ad essere piu' elegante e chiara della corrispondente iterativa, ma in questo caso è il contrario.
Diciamo che dipende, certe cose sono piu` chiare con un loop, certe ricorsivamente.
sars è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 17:16   #18
il_luridone
Member
 
L'Avatar di il_luridone
 
Iscritto dal: Oct 2004
Città: Bologna
Messaggi: 50
A me non sembra tanto strano che la didattica insegni roba poco utile in pratica ma semplice concettualmente.

Capire un concetto nuovo come la ricorsione partendo da casi reali mi sembra controproducente. Una volta compreso il concetto grazie all'esempio banale e scolastico, si può procedere per gradi di difficoltà (come si fa sempre in ogni corso non solo informatico).

Poi sarà compito dello studente digerire il concetto elementare ed applicarlo ai casi veri.
__________________
And the salad is frightful!
I have an important message to deliver to all the cute people all over the world. If you're out there and you're cute, maybe you're beautiful. I just want to tell you something: there's more of us ugly mother-fuckers than you are, hey-y, so watch out.
il_luridone è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 19:06   #19
sars
Junior Member
 
Iscritto dal: May 2006
Messaggi: 5
Quote:
Originariamente inviato da il_luridone
A me non sembra tanto strano che la didattica insegni roba poco utile in pratica ma semplice concettualmente.

Capire un concetto nuovo come la ricorsione partendo da casi reali mi sembra controproducente. Una volta compreso il concetto grazie all'esempio banale e scolastico, si può procedere per gradi di difficoltà (come si fa sempre in ogni corso non solo informatico).

Poi sarà compito dello studente digerire il concetto elementare ed applicarlo ai casi veri.
E qual'e` lo scopo didattico di scrivere algoritmi inutilmente contorti?
sars è offline   Rispondi citando il messaggio o parte di esso
Old 28-05-2006, 20:36   #20
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da sars
E qual'e` lo scopo didattico di scrivere algoritmi inutilmente contorti?
imparare la sofisticata tecnica della contorsione, anche detta yoga informatico; aiuta a ritrovare il benessere interiore del tuo software: diurifica, vivifica, slarga le vene, fa ca@are bene.
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Il nuovo Qualcomm Snapdragon 8 Gen 5 stu...
Sky e Amazon trasmetteranno la Champions...
'Robot abbastanza forti da fratturare un...
Anche DAZN ha il suo Black Friday: 40 eu...
Carmageddon: Rogue Shift, il prossimo ca...
Redal Alert 2: Command & Conquer si ...
Kingston Technology: memorie e storage c...
Narwal Freo Z10 Ultra: il robot con moci...
In 3 minuti le vedete tutte: sono le mig...
Black Friday da record per Tineco: le sc...
La nuova PS5 con Fortnite manda in tilt ...
Amazon, i tagli hanno colpito soprattutt...
Pazzesco: Panasonic Lumix DC-GH5M2E a 79...
Ecco tutte le offerte Black Friday pi&ug...
DJI Neo a 169€, Flip Combo a 309€ e molt...
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:38.


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