Oppure

Loading
18/12/07 14:59
spaghetto
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...!!!

#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!!!:d
Ultima modifica effettuata da spaghetto 18/12/07 15:08
aaa