Code
int f(int x)
{
if (x==0)
{
return 1;
}
rturn x*f(x-1);
}
, не нужная рекурсия, функция считает произведение всех целых чисел от единицы до аргумента и возвращает 1 при ноле, что выливается в два неявных цикла сначала вызовов, а потом подстановок, которые можно заменить одним: Code
int f(int x)
{
int r, i;
r=1;
for (i=2; i<=x; ++i)
{
r*=i;
}
return r;
}
, что дополнительно позволит с экономить стек, так как на каждом вложенном вызове в нём отводится место для аргумента и адреса возврата, а уровнем выше для результата, + каждый вызов/возврат связан ещё и с операциями со стеком. Code
void gauss(double *a, double *b, double *x, int n)
{
double *i;
double *j;
double *k;
double z;
double s;
for (i=a; i<=a+(n-2)*n; i+=n)
{
for (j=i+n; j<=a+(n-1)*n; j+=n)
{
z=*j/*i;
*j=0.0;
for (k=j+1; k<j+n; ++k)
{
*j-=(*i)*z;
}
b[(j-a)/n]-=b[(i-a)/n]*z;
}
}
for (i=a+(n-1)*n; i>=a; i-=n)
{
s=0.0;
for (k=i+1; k<i+n; ++k)
{
s+=(*k)*(x[(k-a)/n]);
}
x[(i-a)/n]=(b[(i-a)/n]-s)/(*i);
}
}
без толку линерализована матрица коэффициентов, адресная арифметика используется для вычисления индекса, лучше так: Code
void gauss(double **a, double *b, double *x, int n)
{
int i, j, k, e;
double z, s;
e=n-1;
for (i=0; i<e; ++i)
{
for (j=i+1; j<n; ++j)
{
z=a[j][i]/a[i][i];
a[j][i]=0.0;
for (k=i+1; k<n; ++k)
{
a[j][k]-=a[i][k]*z;
}
b[j]-=b[i]*z;
}
}
for (i=n-1; i>=0; --i)
{
s=0.0;
for (k=i+1; k<n; ++k)
{
s+=a[i][k]*x[k];
}
x[i]=(b[i]-s)/a[i][i];
}
, что проще, а это снижает вероятность ошибок. Расход же памяти на хранение указателей на строки не на столько критичен, чтоб из-за него жертвовать читабельностью.