Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI
Con velocità teoriche fino a 11 Gbps, gestione tramite app intelligente e protezione avanzata dei dispositivi, Roamii BE Pro porta il Wi‑Fi 7 tri‑band nelle abitazioni più esigenti. Un sistema Wi-Fi Mesh proposto da MSI allo scopo di garantire agli utenti una rete fluida e continua capace di sostenere streaming 8K, gaming competitivo e le applicazioni moderne più esigenti in termini di banda
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-11-2012, 14:53   #1
LoneFellow
Junior Member
 
Iscritto dal: Nov 2012
Messaggi: 8
[C/C++] Ricorsione

Salve a tutti ,
La ricorsione sta nel scrivere , in ordine crescente i numeri da 0 a N in binario, tutto quanto tramite una ricorsione . Il problema è risolto , solo che si capisce che una volta arrivato alla fine del vettore , si passa all elemento successivo portandolo a uno ed il resto tra il elemento attuale ed N viene messo a " 0 " dopo di che successivamente settato con " 1 " da N verso il elemento attuale e cosi via . Quello che non capisce è come fa a decrescere " i " e come fa ad uscire dalla ricorsione una volta stampato l ultimo numero.

La funzione sarebbe questa :
Codice:
void binary(int i, int *vet, int n)
{
  int j;

  if (i >= n) {
    for (j=0; j<n; j++) {
      printf("%d", vet[j]);
    }
    printf("\n");
    return;
  }

  vet[i] = 0;
  binary(i+1, vet, n);

  vet[i] = 1;
  binary(i+1, vet, n);
}
LoneFellow è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 15:37   #2
LoneFellow
Junior Member
 
Iscritto dal: Nov 2012
Messaggi: 8
Intricata? Di funzionare funziona ... Guarda l intero codice è questo..
Codice:
#include <stdio.h>
#include <stdlib.h>

void binary(int i, int *vet, int n);

int main(void)
{
  int n, *vet;

  printf("Numero di bit: ");
  scanf("%d", &n);

  vet = (int *)malloc(n * sizeof(int));
  if (vet == NULL) {
    printf("Errore di allocazione.\n");
    exit(1);
  }
  printf("Numeri Binari\n");
  binary(0, vet, n);
  free(vet);

  //system("pause");
  return 0;
}

void binary(int i, int *vet, int n)
{
  int j;

  if (i >= n) {
    for (j=0; j<n; j++) {
      printf("%d", vet[j]);
    }
    printf("\n");
    return;
  }

  vet[i] = 0;
  binary(i+1, vet, n);

  vet[i] = 1;
  binary(i+1, vet, n);
}
LoneFellow è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 16:49   #3
LoneFellow
Junior Member
 
Iscritto dal: Nov 2012
Messaggi: 8
Mi scuso mi sono spiegato male, il codice è funzionale al 100% , vorrei solo sapere come fa a decrescere "i" e come fa a stabilire la fine della ricorsione. Perchè guardando il codice non riesco a capirlo. Mentre quel "return" piazzato la in mezzo all' iterazione
LoneFellow è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 18:25   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Data la funzione ricorsiva:
Codice:
void binary(int i, int *vet, int n)
{
    int j;
    if (i >= n) {
        for (j=0; j<n; j++) {
            printf("%d", vet[j]);
        }
        printf("\n");
        return;
    }

    vet[i] = 0;
    binary(i+1, vet, n);

    vet[i] = 1;
    binary(i+1, vet, n);
}
Abbiamo che il caso base (quello in cui la ricorsione termina) è la parte evidenziata in sienna (l'ultima istruzione del blocco è appunto un return).
Nota infatti che è un blocco if. La condizione di uscita è appunto i >= n, quindi la ricorsione termina quando la variabile "i" assume un valore maggiore o uguale alla variabile "n".

I valori iniziali delle variabili "i" e "n" sono determinati dal chiamante che li passa alla funzione, dopodiche "n" rimane costante per tutta la durata delle chiamate ricorsive mentre si vede che "i" viene incremetntata (non decrementata) ad ogni chiamata ricorsiva, l'ho evidenziato in oliva
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 19-11-2012 alle 18:28.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 18:48   #5
LoneFellow
Junior Member
 
Iscritto dal: Nov 2012
Messaggi: 8
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Data la funzione ricorsiva:
Codice:
void binary(int i, int *vet, int n)
{
    int j;
    if (i >= n) {
        for (j=0; j<n; j++) {
            printf("%d", vet[j]);
        }
        printf("\n");
        return;
    }

    vet[i] = 0;
    binary(i+1, vet, n);

    vet[i] = 1;
    binary(i+1, vet, n);
}
Abbiamo che il caso base (quello in cui la ricorsione termina) è la parte evidenziata in sienna (l'ultima istruzione del blocco è appunto un return).
Nota infatti che è un blocco if. La condizione di uscita è appunto i >= n, quindi la ricorsione termina quando la variabile "i" assume un valore maggiore o uguale alla variabile "n".

I valori iniziali delle variabili "i" e "n" sono determinati dal chiamante che li passa alla funzione, dopodiche "n" rimane costante per tutta la durata delle chiamate ricorsive mentre si vede che "i" viene incremetntata (non decrementata) ad ogni chiamata ricorsiva, l'ho evidenziato in oliva
Quell iterazione viene usata solamente per stampare il vettore , dopo di che il return salta alla seconda chiamata della funzione ..
Se provi a guardarlo con un debug vedrai. Poi ogni volta che passa il return e fa la chiamata alla funzione decrementa .. Per quello dicevo che mi pare strano, come fa " i " a decrementare .
LoneFellow è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 19:05   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da LoneFellow Guarda i messaggi
Poi ogni volta che passa il return e fa la chiamata alla funzione decrementa .. Per quello dicevo che mi pare strano, come fa " i " a decrementare .
Ops... ho letto il codice in fretta, e ora che me lo fai notare hai ragione.
Infatti prova a simulare cosa succede se chiami la funzione con i che vale 1 e n che vale 2...
La variabile i non viene mai decrementata, credo che a un certo punto si vada a scrivere fuori dell'array... se ti ha fuzionato è stata una questione di culo.

Fai prima a scrivertene una nuova tu, magari con un approccio diverso (ad esempio l'operazione di stampa dell'array non ha niente a che vedere con la creazione dell'array stesso, la lascierei fuori della funzione). Prima butta giù l'algoritmo in pseudocodice, come ha fatto Antonio23, poi lo implementi.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 19:45   #7
LoneFellow
Junior Member
 
Iscritto dal: Nov 2012
Messaggi: 8
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
se ti ha fuzionato è stata una questione di culo.

Fai prima a scrivertene una nuova tu, magari con un approccio diverso (ad esempio l'operazione di stampa dell'array non ha niente a che vedere con la creazione dell'array stesso, la lascierei fuori della funzione). Prima butta giù l'algoritmo in pseudocodice, come ha fatto Antonio23, poi lo implementi.
La funzione genera tutti i numeri di n bit , n viene acquisito , 2 bit genera i numeri 00 01 10 11 , 3 bit generea 000 001 010 011 100 101 111 etc .. E infatti il codice è leggibile per me solo a un certo punto , il concetto della ricorsione l ho capito ma non ho capito come ha fatto ad implementarlo, se noti partendo dall posizione 2 lui azzerra poi riempie di uno, ed uno alla volta stampa, arrivato alla posizione di 1 lui la prossima la mette a 1 che era 0, azzerra tutto di nuovo eccetto la nuova posizione, e dopo dalla coda del vettore riempie di uno e stampa ogni volta che inizializa una posizione. Non è culo, non capisco come caspita fa quella i ad incrementare, visto che non è una meccanica esplicita ...
LoneFellow è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 19:46   #8
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2787
A me la funzione sembra giusta... dov'è l'errore?
Se con un breakpoint ti posizioni all'interno dell'if è normale che vedrai i decrementare perché dopo il return tornerai alla funzione chiamante dove i non vale più i+1 ma solo i.
Tra l'altro questa soluzione non sarà elegante e leggibile però è interessante.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 19:57   #9
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2787
Ho provato a fare un disegnino...

Questo bellissimo disegno vorrebbe rappresentare sotto forma di albero le chiamate ricorsive per n=3.
Su ogni nodo ho segnato uno zero o un uno, se ci fai caso tutti i rami di sinistra hanno zero, tutti quelli di destra uno. I rami di sinistra rappresentano la prima chiamata ricorsiva, i rami di destra la seconda. Il numero 0 o 1 è quello che viene scritto in vet[i] prima della chiamata.
Quando i=n, in questo caso quando i=3, il ciclo stampa i valori di vet[0], vet[1] e vet[2], cioè i valori sul cammino dalla radice alla foglia.
A me sembra carina come soluzione...
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 21:19   #10
LoneFellow
Junior Member
 
Iscritto dal: Nov 2012
Messaggi: 8
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
A me la funzione sembra giusta... dov'è l'errore?
Se con un breakpoint ti posizioni all'interno dell'if è normale che vedrai i decrementare perché dopo il return tornerai alla funzione chiamante dove i non vale più i+1 ma solo i.
Tra l'altro questa soluzione non sarà elegante e leggibile però è interessante.
Ho provato, ho messo dei break point su tutta la funzione solo che il decremento lo mostra mentre il cursore del break point è sulla parentesi di chiusura . Cosi non essendo una chiamata di riferimento il valore non viene sovrascritto. Bene questo una volta ma se capita più volte di fila ? Vuoi dire forse che io percorgo un cammino diverso partendo sempre dalla radice, e ogni volta che finisco ritorno indietro al valore iniziale, ma essendo che sono ancora nella funzione iniziale mi rimane solo il incremento iniziale ? Cosi i decrementi che mi mostra sulla parentesi grafe sarebbe il percorso al ritroso della chiamata?
LoneFellow è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 21:44   #11
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2787
Esatto, prendi ad esempio il cammino 011 del disegnino che ho fatto prima: prima di passare al valore successivo (100) vedrai decrementarsi i 3 volte. In realtà non è che i si decrementa, semplicemente i non è mai cambiata. Devi immaginare che le diverse chiamate a funzione si impilano una sull'altra, ognuna con i propri parametri. Quando la funzione in cima alla pila giunge all'istruzione return, essa si "estrae" dalla pila e l'esecuzione riparte dov'era rimasta nella funzione immediatamente sotto.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2012, 22:11   #12
LoneFellow
Junior Member
 
Iscritto dal: Nov 2012
Messaggi: 8
Capito, alla fine bastava cambiare ottica
Grazie .
LoneFellow è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2012, 15:16   #13
LoneFellow
Junior Member
 
Iscritto dal: Nov 2012
Messaggi: 8
Un ultima domanda , visto che le funzioni sono concatenate, c è un modo per poterle rintraciare con il debug? Che già adesso con un problema semplice come questa con n 3 sono 12 chiamate ..
Comunque, è come se dopo la chiamata dopo che inizializa a 1 avesse un return perciò ritorna alla precedente , penso sia implicito, anche perchè dopo di lei il codice finisce..

Ultima modifica di LoneFellow : 20-11-2012 alle 15:20.
LoneFellow è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Linux sotto assedio: SSHStalker riporta ...
Stellantis: dopo il crollo di venerd&igr...
Combat Liquid 360 HUD: raffreddamento AI...
Tornano le EVO Sessions della Formula E:...
Moltbook, il social network per AI: i po...
Cina: eseguito il test della navicella M...
Mistral, il rivale europeo di OpenAI, in...
Libri piratati, allarme rosso: 722 milio...
Ayaneo svela quasi tutte le specifiche d...
Sony chiude definitivamente con i regist...
Renault Twingo E-Tech Electric sotto i 2...
Auto elettriche, il freddo non fa pi&ugr...
Amazon, ancora sconti sugli smartphone: ...
Il dispositivo hardware AI di Jony Ive p...
Wikipedia valuta il blocco di Archive.to...
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: 18:22.


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