spaghetto (Normal User)
Newbie
Messaggi: 4
Iscritto: 18/12/2007
|
Salve ragazzi, è la prima volta che vi scrivo, e ho deciso di rompervi un pò perchè non riesco a svolgere nella maniera corretta un esercizio con la ricorsione...
Quello che devo fare è questo...
Dato in input un valore positivo n, devo devo scrivere una funzione che mi restituisce il valore delle partizioni...per partizioni intendo quel gruppo di numeri che se sommati mi da n stesso...
per esempio se dò input 4, come output avrò 5, poichè 4 si ricava da questi numeri:
1 1 1 1
1 1 2
1 3
2 2
4
Da notare inoltre che ogni numero non può essere inferiore al precedente e maggiore di n...
spero di essermi spiegato!
Sono riuscito a risolverlo questo esercizio, ma nella maniera sbagliata, ovvero utilizzando sì la ricorsione ma anche con una funzione di supporto...
ecco il codice del mio esercizio...ve lo lascio ma tanto è alquanto inutile...!!!
Codice sorgente - presumibilmente C++ |
#include<stdio.h> void verifica(int a[],int n,int m, int *i); // Prototipi di funzione int funz(int a[],int n,int m,int i,int cont); int main() { int ris; int n,x,y,somma=0; scanf("%d",&n); // Prendo la dimensione di n for(x=n;x>0;x--) { // Passo con più cicli i vari vettori creati con la dimensione n int a[x]; for(y=0;y<x;y++) a[y]=1; ris=funz(a,x,n,1,0); somma=somma+ris; } printf("%d\n",somma); return 0; } int funz(int a[],int n,int m,int i,int cont) { // Funzione ricorsiva int somma,x,y; somma=0; for(x=0;x<n;x++) somma=somma+a[x]; // Verifico se la somma da il valore n, qui chiamato con la variabile m if(somma==m) cont++; for(x=0;x<n;x++) if(a[x]!=m) break; if(x==n) return cont; // Se arrivo alla fine ritorno il valore cont verifica(a,n,m,&i); return funz(a,n,m,i,cont); } void verifica(int a[],int n, int m,int *i) { // Funzione non ricorsiva che mi permette di poter correggere e di poter sistemare il vettore man mano che crescono gli elementi int x,y; *i=*i+1; a[n-1]=*i; if(a[n-1]>m) { for(x=n-1;x>0;x--) { if(a[x]>m) { a[x]=1; a[x-1]=a[x-1]+1; } } for(y=n-1;y>0;y--){ for(x=n-1;x>0;x--) { if(a[x]<a[x-1]) a[x]=a[x-1]; }} } return; }
|
Il mio intento sarebbe riuscire a svolgerlo in una maniera più semplice, il problema è che non sono in grado !!!
Vi ringrazio in anticipo per le eventuali risposte!
Grazie Mille!!!
Ultima modifica effettuata da spaghetto il 18/12/2007 alle 16:08 |