Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    25

    [C] Creare una Lista con “n” elementi della serie di Fibonacci.

    Salve a tutti,
    come da oggetto sto cercando di scrivere una funzione che crea una lista con “n” elementi della serie di Fibonacci. Non riesco a capire dove sbaglio... Grazie a chi mi vorrà aiutare.

    codice:
    typedef struct numeriDiFibonacci
    	{
    	int num;
    	struct numeriDiFibonacci *suc;
    	} Nf;
    
    Nf * creaListaFib(int n)
    {
    if (n == 0)	return(NULL);
    Nf *testa, *prima, *seconda, *ennesima;
    prima = (Nf *)malloc(sizeof(Nf));
    prima->num = 1;
    prima->suc = NULL;
    testa = prima;
    if (n == 1)	return(testa);
    seconda = (Nf *)malloc(sizeof(Nf));
    seconda->num = 1;
    seconda->suc = NULL;
    prima->suc = seconda;
    if (n == 2)	return(testa);
    int i;
    for (i=3; i<=n; i++)
    	{
    	ennesima = (Nf *)malloc(sizeof(Nf));
    	ennesima->num = prima->num + seconda->num;
    	ennesima->suc = NULL;
    	seconda->suc = ennesima;
    	prima = prima->suc;
    	seconda = seconda->suc;
    	}
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Questa e' un mio esempio (scritto velocemente) ... spero non ci siano bug ...

    codice:
    typedef struct numeriDifib
    {
       int num;
       struct numeriDifib *suc;
    } Nf;
    
    int fib(int num)	
    {
      return (num < 2 ? num : fib(num-1) + fib(num-2));
    }
    
    Nf *creaListaFib(int n)
    {
      int i;
      Nf *pHead=NULL, **ppNewItem;
    
      if(n==0) return(NULL);
    
      pHead = (Nf *)malloc(sizeof(Nf));
      pHead->num = fib(1);
      pHead->suc = NULL;
      ppNewItem = &pHead->suc;
    
      for(i=2; i<=n; i++)
      {
        (*ppNewItem) = (Nf *)malloc(sizeof(Nf));
        (*ppNewItem)->num = fib(i);
        (*ppNewItem)->suc = NULL;
    
        ppNewItem = &((*ppNewItem)->suc);
      }
    
      return(pHead);
    }
    
    int main(void)
    {
      Nf *fib = creaListaFib(30);
      Nf *tmp = fib;
    
      do
      {
        printf("%d\n", tmp->num);
        tmp = tmp->suc;
      } while(tmp);
    
      return 0;
    }
    E' una implementazione inefficiente (e capirai il perche' da solo) ma piu' "elegante" ...

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Una implementazione modificata e piu' efficiente e'

    codice:
    typedef struct numeriDifib
    {
      int num;
      struct numeriDifib *suc;
    } Nf;
    
    Nf *creaListaFib(int n)
    {
      int i, prev, curr, res;
      Nf *pHead=NULL, **ppNewItem;
    
      if(n==0) return(NULL);
    
      pHead = (Nf *)malloc(sizeof(Nf));
      pHead->num = 1; 
      pHead->suc = NULL;
      ppNewItem = &pHead->suc;
    
      prev = 1;
      curr = 0;
      for(i=2; i<=n; i++)
      {
        res = prev+curr;
    
        (*ppNewItem) = (Nf *)malloc(sizeof(Nf));
        (*ppNewItem)->num = res; 
        (*ppNewItem)->suc = NULL;
    
        ppNewItem = &((*ppNewItem)->suc);
    
        curr=prev;
        prev=res;
      }
    
      return(pHead);
    }
    
    int main(void)
    {
      Nf *fib = creaListaFib(30);
      Nf *tmp = fib;
    
      do
      {
        printf("%I64d\n", tmp->num);
        tmp = tmp->suc;
      } while(tmp);
    
      return 0;
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    25
    Grazie, il codice da te scritto è più elegante e funziona.
    Ti chiedo scusa se pretendo tropo... ma mi aiuterebbe se mi dicessi dove era l’errore logico nella funzione scritta da me.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No ... anche la tua funziona ... ho dimenticato di dirtelo ... hai solamente dimenticato un

    return(testa);

    alla fine della funzione ...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    25
    Grazie, è proprio vero che quando l’errore ti sta davanti al naso è più difficile vederlo!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.