Пятница, 29 Марта 2024, 01:51

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Как делать не надо
Как делать не надо
ТритонДата: Среда, 02 Мая 2012, 14:28 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
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];  
}
, что проще, а это снижает вероятность ошибок. Расход же памяти на хранение указателей на строки не на столько критичен, чтоб из-за него жертвовать читабельностью.


Не всё так плохо, как оно есть на самом деле.
Форум игроделов » Программирование » C/C++ » Как делать не надо
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг