Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti. Scrivere una funzione ricorsiva di coda che calcoli la distanza di hamming tra due interi dati Una sequenza di k interi si dice linearmente crescente se il valore di ogni coordinata è maggiore o uguale alla somma delle coordinate anteriori. Si scriva un algoritmo che generi tutte le sequenze di k elementi nell'insieme {1, ..., n} linearmente crescenti. Una sequenza di k interi si dice massimamente crescente se il valore di ogni coordinata è strettamente maggiore del massimo delle coordinate anteriori. Si scriva un algoritmo che generi tutte le sequenze di k elementi nell'insieme {1, ..., n} massimamente crescenti. NOTA: scrivere sempre pre e post condizione di ogni funzione
Esercizio 1 La distanza di Hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti. Scrivere una funzione ricorsiva di coda che calcoli la distanza di Hamming tra due interi dati Es. se x = 24 e y = 7, la funzione deve restituire 5 dal momento che la rappresentazione binaria dei due numeri è 11000 e 00111 Pre condizioni: La funzione prende in ingresso i due interi x e y Post condizioni: La funzione restituisce la distanza di Hamming
Implementazione ricorsiva di coda int ham(int x, int y, int h) { if (x == 0 && y == 0) return h; return ham(x, y, h+(x % 2 != y % 2 ? 1 : 0)); }
Esercizio 2 Una sequenza di k interi si dice linearmente crescente se il valore di ogni coordinata è maggiore o uguale alla somma delle coordinate anteriori. Si scriva un algoritmo che generi tutte le sequenze di k elementi nell'insieme {1, ..., n} linearmente crescenti. Pre condizioni: la funzione prende in ingresso due interi k e n Post condizioni: la funzione stampa tutte le sequenze linearmente crescenti
Svolgimento void gen(int n, int k) { int t[k]; gen_ric(n, k, 0, 0, t); } int gen_ric(int n, int k, int l, int somma, int *t) if (l == k) { stampa(t); return; } for (int j = somma > 0 ? somma : 1; j <= n; j++) t[l] = j; gen_ric(n, k, l+1, somma+j, t);
Esercizio 3 Una sequenza di k interi si dice massimamente crescente se il valore di ogni coordinata è strettamente maggiore delle coordinate anteriori. Si scriva un algoritmo che generi tutte le sequenze di k elementi nell'insieme {1, ..., n} massimamente crescenti. Pre condizioni: la funzione prende in ingresso due interi k e n Post condizioni: la funzione stampa tutte le sequenze massimamente crescenti
Svolgimento void gen(int n, int k) { int t[k]; gen_ric(n, k, 0, 0, t); } int gen_ric(int n, int k, int l, int m, int *t) if (l == k) { stampa(t); return; } for (int j = m+1; j <= n; j++) t[l] = j; gen_ric(n, k, l+1, j, t);