تو این روش به جای اینکه از جمله n ام شروع کنیم و به جمله ی اول برسیم از جمله اول شروع می کنیم و به جمله n می رسیم تا هر جمله فقط یه بار محاسبه بشه

کد:
long int helpfibo(long int n,long int current, long int f1,long int f2)
{
    if(n<=0 || current <=0)
     return -1;
   if (n==1 || n==2 )
    return 1;
   if (current==n)
    return f1+f2;
 
   return helpfibo(n,current+1,f1+f2,f1);
 
}
 
long int fibo(long int n)
{
    return helpfibo(n,3,1,1);
}

یه راه دیگه هم اینکه مقادیر بدست اومده رو توی ارایه ذخیره کنید


کد:
long int helpfibo(long int n,long int *a)
{
    if (n==1|| n==2 )
        return 1;
    if(!a[n-1])
        a[n-1]=helpfibo(n-1,a);
 
    return a[n-1]+a[n-2];
 
 
}
 
long int fibo(long int n)
{
   if (n<=0)
    return -1;
    long int * buffer=new long int[n+1],result;
   if(buffer)
   {
    buffer[1]=buffer[2]=1;
    result=helpfibo(n,buffer);
   }
   else
    return -1;
   delete buffer;
   return result;
}