help ricorsione URGENTE
Moderatore: Staff
Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- Blallo
- Packager

- Messaggi: 3302
- Iscritto il: ven 12 ott 2007, 11:37
- Nome Cognome: Savino Liguori
- Slackware: 14.2 / 12.2
- Kernel: 4.4.14-smp
- Desktop: DWM
- Località: Torino / Torremaggiore (FG)
- Contatta:
help ricorsione URGENTE
Devo creare un programma in c che dato n da tastiera, generi tranite ricorsione tutti i numeri binari composti da n bit
ES: n=3
devo creare e stampare
000
001
010
011 ecc ecc
ES: n=3
devo creare e stampare
000
001
010
011 ecc ecc
Github: https://github.com/8lall0
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: help ricorsione URGENTE
Ehm, l'aiuto qual'è? Vuoi che te lo facciamo per te 
Emanuele
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- Blallo
- Packager

- Messaggi: 3302
- Iscritto il: ven 12 ott 2007, 11:37
- Nome Cognome: Savino Liguori
- Slackware: 14.2 / 12.2
- Kernel: 4.4.14-smp
- Desktop: DWM
- Località: Torino / Torremaggiore (FG)
- Contatta:
Re: help ricorsione URGENTE
Che mi diate un input, sto studiando da poco la ricorsione e non ancora entro nei meccanismi
Github: https://github.com/8lall0
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: help ricorsione URGENTE
Dipende da quali strumenti puoi usare. L'idea potrebbe essere che hai due funzioni, una che dato un numero intero ti stampa la sua rappresentazione binaria, e l'altra, quella ricorsiva, che incrementa di uno un numero. Tipo:
E' un pò stupidina (non è altro che la traduzione di un ciclo while), però questo problema si presta poco alla ricorsione. limit=2^numero_di_bit. La prima invocazione è incr(2^numero_di_bit, 0);
Però magari ti si chiede anche di implementare la funzione di stampa come ricorsiva. Se puoi usare gli operatori bit a bit è più semplice.
Emanuele
Codice: Seleziona tutto
function incr(limit, num)
{
stampa(num);
if ( (++num) == limit )
return;
incr(limit, num);
}Però magari ti si chiede anche di implementare la funzione di stampa come ricorsiva. Se puoi usare gli operatori bit a bit è più semplice.
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- Blallo
- Packager

- Messaggi: 3302
- Iscritto il: ven 12 ott 2007, 11:37
- Nome Cognome: Savino Liguori
- Slackware: 14.2 / 12.2
- Kernel: 4.4.14-smp
- Desktop: DWM
- Località: Torino / Torremaggiore (FG)
- Contatta:
Re: help ricorsione URGENTE
giusto dimenticavo...non devo usare conversioni decimale->binario, quindi dovrei operare su un vettore allocato dinamicamente costituente le cifre del binario
Github: https://github.com/8lall0
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: help ricorsione URGENTE
Cioè in pratica dovresti avere un array grande quanto il numero di bit ed inizializzarlo a 0000, o cose di questo tipo e poi lavorarci su?
Emanuele
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- Blallo
- Packager

- Messaggi: 3302
- Iscritto il: ven 12 ott 2007, 11:37
- Nome Cognome: Savino Liguori
- Slackware: 14.2 / 12.2
- Kernel: 4.4.14-smp
- Desktop: DWM
- Località: Torino / Torremaggiore (FG)
- Contatta:
Re: help ricorsione URGENTE
Esatto. Hai centrato in pieno. Scusami se di solito sono poco chiarospina ha scritto:Cioè in pratica dovresti avere un array grande quanto il numero di bit ed inizializzarlo a 0000, o cose di questo tipo e poi lavorarci su?
Emanuele
Github: https://github.com/8lall0
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: help ricorsione URGENTE
ok, allora l'idea è la stessa solo che la funzione di incremento non è più num++ ma la devi implementare tu su un array binario. Ora vedo cosa riesco a fare. L'idea ricorsiva non cambia e neanche l'idea di avere due funzioni delle quali una delegata alla stampa.
Emanuele
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: help ricorsione URGENTE
Ecco qui una possibile implementazione:
Uso la define per semplificarmi la vita, non credo troverai difficoltà a parametrizzare le funzioni.
Emanuele
Codice: Seleziona tutto
#include <stdio.h>
#define SIZE 3
/* Azzera i primi i bit di a */
void reset(int i, char *a)
{
int j;
for ( j=0; j < i; j++ )
a[j] = '0';
}
/* Stampa l'array a */
void stampa(char *a)
{
int i;
for ( i=SIZE; i >= 0; i-- )
putchar(a[i-1]);
putchar('\n');
}
/* Incrementa a di uno */
void incr(char *a)
{
int i, change;
stampa(a);
for ( change=i=0; i < SIZE; i++ )
if ( a[i] == '0' )
{
a[i] = '1';
reset(i, a);
change=1;
break;
}
if ( change == 0 )
return;
incr(a);
}
int main()
{
char array[SIZE];
reset(SIZE, array);
incr(array);
return 0;
}Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- Blallo
- Packager

- Messaggi: 3302
- Iscritto il: ven 12 ott 2007, 11:37
- Nome Cognome: Savino Liguori
- Slackware: 14.2 / 12.2
- Kernel: 4.4.14-smp
- Desktop: DWM
- Località: Torino / Torremaggiore (FG)
- Contatta:
Re: help ricorsione URGENTE
grazie mille spina 
ho analizzato per bene il codice, e mi hai fatto venire in mente un metodo ancora più veloce
ho analizzato per bene il codice, e mi hai fatto venire in mente un metodo ancora più veloce
Codice: Seleziona tutto
void incr(int *v, int N, int i)
{
int j;
if(i==N)
{
for(j=0;j<N;j++)
printf("%d", v[j]);
printf("\n");
return ;
}
else
{
v[i]=0;
incr(v, N, i+1);
v[i]=1;
incr(v, N, i+1);
}
}Github: https://github.com/8lall0
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: help ricorsione URGENTE
Bhé, non c'è che dire, una soluzione bella ed elegante (solo che io avrei demandato la stampa ad una funzione a parte)
Emanuele
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: help ricorsione URGENTE
Ho fatto un confronto e stranamente il tuo algoritmo è più lento (per quanto sia affidabile time):
Però il tuo algoritmo ha un altro vantaggio, quello di terminare le ricorsioni ogni N passi. Il mio continua a fare ricorsioni fino a che non raggiunge l'ultimo numero, e questo porta ad un errore quando N è troppo grande. Il tuo invece è più robusto.
Emanuele
Codice: Seleziona tutto
N=15
Spina
------
real 2.17
user 0.03
sys 0.12
Jimmy
--------
real 2.27
user 0.01
sys 0.17
Codice: Seleziona tutto
N=16
Spina
-------
real 4.75
user 0.06
sys 0.12
Jimmy
---------
real 6.16
user 0.07
sys 0.07
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama