Care din următoarele implementări recursive sunt eficiente?

double exp (double x, int n)
{
  double val;
  if(n==0) return 1;
  val = exp(x, n/2);
  if(n%2 == 0)
    return val*val;
    else
      return val*val*x;
}

float d (float a, float b)
{
  float c=0;
  if(a>b)
    return ++c+2*d(a-1, b);
  return a;
}

double F(double x)
{
  if(x>0)
    return F(x/2)+F(x/2);
  return 2;
}

int a(int x, int y)
{
  if(x==y)
     return x;
  if(x>y) return a(x-y,y);
  return a(x,y-x);
}