Oppure

Loading
30/11/16 13:53
Lafa_96
Salve a tutti, sono piantato da 2 giorni su un problema abbastanza stupido che però mi sta facendo diventare pazzo (probabilmente, anzi sicuramente, sono più stupido io del problema):
sto cercando di creare una funzione (possibilmente ricorsiva) che dato n mi generi tutti i vettori possibili di n elementi 0 e 1.
In sostanza se n=3 il numero di vettori sarà 2^3=8.
Ho cercato un po' in giro ma non ho trovato codice utile al mio scopo e non so più dove sbattere la testa perchè le soluzioni più simili (e comunque poco utili) al mio problema sono tutte iterative!

Grazie in anticipo :)
aaa
30/11/16 17:26
TheDarkJuster
Se non sai passare da una funzione iterativa a una ricorsiva torna indietro e ristudia meglio.

In realtà l'esercizio è una stupidaggine, ti danno n, che è il numero di bit: tu fai un ciclo (implementato come ti pare) che va da 0 a 2^n-1.


quindi qualcosa del genere:


void stampaCombinazione(int n, int k = 0) {
    if (k == pow(2,n))
        return;
    
    // qui stampi k in formato binario e vai a capo

    stampaCombinazione(n, k + 1);
}



La chiamata alla funzione sarà qualcosa del genere:

stampaCombinazione(lunghezzaVettore);


Il codice fa schifo e non so neanche se sia compilabile, ma il concetto è sicuramente quello corretto.
Ultima modifica effettuata da TheDarkJuster 30/11/16 17:26
aaa
30/11/16 17:55
lumo
L'idea principale è questa, se hai ad esempio l'insieme di tutte le combinazioni di due cifre, {00, 01, 10, 11} allora quelle di tre cifre le ottieni aggiungendo davanti a tutte queste 0 e poi 1, e poi unendole: {000, 001, 010, 011} U {100, 101, 110, 111}
Come puoi notare generandole così puoi anche dimostrare per induzione che sono proprio 2^n, perché ogni volta ne aggiungi il doppio.

Il problema principale qui forse è la gestione della memoria, anche se non so bene se vuoi fare una funzione che ritorni qualcosa o semplicemente stampi tutto.
aaa
01/12/16 7:28
torn24
Personalmente prenderei spunto dal brute force per le password.
Trovare tutte le combinazioni di zero e uno, è come trovare le combinazioni di una password composta dai caratteri 0 e 1, e di lunghezza n.
aaa
01/12/16 14:57
Template
Postato originariamente da Lafa_96:
Ho cercato un po' in giro ma non ho trovato codice utile al mio scopo e non so più dove sbattere la testa


Il codice non si "cerca", si SCRIVE.
E se non sai scriverlo, vuol dire che non ci hai pensato abbastanza.

Possibile, banalissimo, algoritmo:

Funzione ricorsiva:
- Se hai finito le cifre, stampa
- Altrimenti:
---- Poni la k-esima cifra a zero
---- Richiama la funzione sulla (k+1)-esima
---- Poni la k-esima cifra a uno
---- Richiama la funzione sulla (k+1)-esima
- Return
Ultima modifica effettuata da Template 01/12/16 14:58
aaa