Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

Ошибки: Неуместная рекурсия при вычислении миноров

26.09.2014, 13:30. Показов 2907. Ответов 45
Метки нет (Все метки)

Неуместная рекурсия.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
double det(dpuble *a, int n)
{
 double ***minors;
 double result;
 int m;
 int i;
 int j;
 if (n==2)
 {
   return (a[0][0]*a[1][1]-a[1][0]*a[0][1];
 }
 minors=new double**[n];
 for (result=0.0, m=0; m<n; ++m)
 {
  minors[m]=new double*[n-1];
  for (i=0, i<(n-1); i++)
  {
   minors[m][i]=new double[n-1];
   for (j=0, j<(n-1); j++)
   {
    if (i<m)
    {
     minors[m][i][j]=a[i][j+1];
    }
    else
    {
     minors[m][i][j]=a[i-1][j+1];
    }
   }
   if (i%2==0)
   {
    result+=det(minors[m], n-1);
   }
   else
   {
    result-=det(minors[m], n-1);
   }
   delete [] minors[m][i];
  }
  delete [] minors[m];
 }
 delete [] minors;
 return result;
}
void kramer(double **a, int n, double *b, double *x)
{
 double **ax;
 double d;
 double dx;
 int i;
 int j;
 int k;
 d=det(a, n);
 ax=new double*[n];
 for (i=0; i<n; ++i)
 {
  ax=new double [n];  
  for (j=0; j<n; ++j)
  {
   ax[j]=new double [n];  
   for (k=0; k<n; ++k)
   {
    if (i==j)
    {
     ax[j][k]=b[k];
    }
    else
    {
     ax[j][k]=a[j][k];
    }
   }
   dx=det(ax,n);
   x[i]=dx/d;
  }
  for (j=0; j<n; ++j)
  {  
   delete [] ax[j];
  }
 }
 delete [] ax;
}
Ошибка заключается в перерасходе памяти из-за того, что при каждом рекурсивном вызове выделяется память для минора. Хуже всего, если этот программный текст перевести с использованием статических массивов на язык вроде паскаля, где тип массива - полноценный тип и если этим типом декларировать неизменяемый параметр подпрограммы, то он передаётся по значению, а не по указателю. Тогда возможно расходование на миноры дефицитнейшей памяти - стека, причём, ещё и в сочетании с резервированием массивов максимального размера, что увеличивает сам расход памяти. Рекурсию использовать надо, но ровно в двух случаях:
1. Если для решения задачи вообще не получается составить не рекурсивный алгоритм.
2. Если рекурсивны сами обрабатываемые данные (пример тому - работа с деревьями).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.09.2014, 13:30
Ответы с готовыми решениями:

Ошибки при вычислении
Что я опять не так делаю? :wall: В методичке тоже самое написано и все вычислено а у меня не хочет. Файл - в студию!!!

Ошибки при вычислении функции
Нужно нарисовать график функции, но все время возникают следующие ошибки: 200, 215 и 217. uses crt,graph; var ...

Ошибки при вычислении выражения
Помогите почему не работает #include&lt;conio.h&gt; #include&lt;math.h&gt; #include&lt;stdio.h&gt; int main() { float i,ch,n,S,f,eps; ...

45
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.09.2014, 18:39  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
- торопишься... Ты приглядись - у меня не используются двумерные массивы
Ещё хуже.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38207 / 21140 / 4311
Регистрация: 12.02.2012
Сообщений: 34,752
Записей в блоге: 14
26.09.2014, 19:07
Цитата Сообщение от taras atavin Посмотреть сообщение
Ещё хуже.
- чем же? Код прозрачный, занятие/освобождение памяти - рядом. Все логично.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.09.2014, 19:14  [ТС]
Что такого специфически прозрачного в смешении обработки в одну кучу с линерализацией?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38207 / 21140 / 4311
Регистрация: 12.02.2012
Сообщений: 34,752
Записей в блоге: 14
26.09.2014, 20:33
Несмотря на "смешение", мой код в добрых 1.5 раза короче. Да и на глаз - проще. Только и всего.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
26.09.2014, 20:38  [ТС]
Короче - не значит проще. Я не смог его прочитать даже с комментариями. Запутался уже в переменных.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38207 / 21140 / 4311
Регистрация: 12.02.2012
Сообщений: 34,752
Записей в блоге: 14
26.09.2014, 20:46
Цитата Сообщение от taras atavin Посмотреть сообщение
Я не смог его прочитать даже с комментариями. Запутался уже в переменных.
- ну это твои проблемы...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.09.2014, 20:46

Ошибки при вычислении в double
При выполнении самых простых операций над числами происходит непонятно что. double k = 14.02 - 14; // k = 0.019999999999999574 ...

Ошибки при вычислении интегралов
Здравствуйте! Решаю следующую задачу по тер вер.: есть совместная плотность случайных величин f(x,y): f(x,y)=a*m*exp(-(a*x+m*y)) в...

Ошибки при вычислении выражения
Народ, я в затупке, что я не так делаю вот код Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object,...

Найти ошибку(ошибки) при вычислении суммы
функция y=\frac{\left( {S}^{3}+0.01n\right)}{S+3} s=m\sum_{k=1}^{20}\frac{1}{{k}^{2}} Написал следующее. Где-то должна быть...

При вычислении функции arccos и преобразовании её в arctg возникают ошибки.
Надо вычислить. #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #define sqr(t) ((t) * (t)) #define sqrt(t) ((t) / (t)) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
46
Ответ Создать тему
Новые блоги и статьи
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru