Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2021, 03:51   #11
aleksey95
 
Регистрация: 20.07.2021
Сообщений: 9
По умолчанию

Цитата:
Сообщение от aleksey95 Посмотреть сообщение
Я не могу понять как присвоить sum=moduleArray[0].F[i1]+moduleArray[1].F[i2]+moduleArray[2].F[i3]; в рекурсии. То же самое обстоит и с limit[j1]=moduleArray[0].L[i1][j1-1]+moduleArray[1].L[i2][j1-1]+moduleArray[2].L[i3][j1-1]; Это возможно? По сути задача создания рекурсии сводится к этому.
А, может, использовать не рекурсию, а что-то другое. Просто мне кроме как написания "в лоб" 55 тысяч строк ничего не приходит. К тому же все равно есть ограничения в 127 циклов) вот такая дилема)
aleksey95 вне форума Ответить с цитированием
Старый 24.07.2021, 03:59   #12
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Пример с рекурсией:
Код:
#include <iostream>

using namespace std;

void calculations(int modules, int* indexes)
{
    // double sum = 0;
    for (int i = 0; i < modules; i++)
    {
        cout << indexes[i] << " ";
        // sum += moduleArray[i].F[indexes[i]];
    }
    cout << endl;
}

void recursive_loops(int modules, int cur_module, int* indexes)
{
    if (cur_module == modules)
    {
        calculations(modules, indexes);
        return;
    }
    for (int i = 0; i < 3; i++) // вместо 3 нужно pow(2.0, moduleArray[cur_module].variableNumber)
    {
        indexes[cur_module] = i;
        recursive_loops(modules, cur_module + 1, indexes);
    }
}

int main()
{
    const int modules = 3;
    int A[modules];
    recursive_loops(modules, 0, A);
    return 0;
}
Цитата:
Сообщение от aleksey95 Посмотреть сообщение
А, может, использовать не рекурсию, а что-то другое.
Может быть
Можно сумму считать сразу:
Код:
#include <iostream>

using namespace std;

void calculations(int modules, int* indexes, double sum)
{
    for (int i = 0; i < modules; i++)
    {
        cout << indexes[i] << " ";
    }
    cout << "sum = " << sum << endl;
}

void recursive_loops(int modules, int cur_module, int* indexes, double sum)
{
    if (cur_module == modules)
    {
        calculations(modules, indexes, sum);
        return;
    }
    for (int i = 0; i < 3; i++) // вместо 3 нужно pow(2.0, moduleArray[cur_module].variableNumber)
    {
        indexes[cur_module] = i;
        recursive_loops(modules, cur_module + 1, indexes, sum + i); // вместо i нужно прибавлять moduleArray[cur_module].F[i]
    }
}

int main()
{
    const int modules = 3;
    int A[modules];
    recursive_loops(modules, 0, A, 0);
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 24.07.2021 в 04:08.
BDA вне форума Ответить с цитированием
Старый 24.07.2021, 22:33   #13
aleksey95
 
Регистрация: 20.07.2021
Сообщений: 9
По умолчанию

Нашел решение:
Код:
void ArrayN1(int modules,double* conditionalMatrix, Module* moduleArray,  int columnsNumber, int rowsNumber, double& max, double& min, bool maxMin,  long long& numberOfAdditionOperations, bool* tempResultingVector,double* limit, int cycle,int* i)
{
	double sum;

	if(cycle<modules)
		while(i[cycle]<pow(2.0,moduleArray[cycle].variableNumber))
		{
			if(cycle<modules-1)
				i[cycle+1]=0;
			if(cycle<modules)
				ArrayN1(modules, conditionalMatrix,moduleArray, columnsNumber, rowsNumber,max,min,maxMin,numberOfAdditionOperations,tempResultingVector,limit,cycle+1,i);
			if(cycle==modules-1)
			{
				sum=0;
				for(int k=0;k<modules;k++)
				{
					//for(int m=0;m<modules;m++)
					{
						sum+=moduleArray[k].F[i[k]];
						numberOfAdditionOperations++;
					}
				}

				if((maxMin && sum<=max) || (!maxMin && sum>=min)) 
				{i[cycle]++;
				continue; }

				for(int j1=1;j1<rowsNumber;j1++)
					limit[j1]=0;
				for(int m=0;m<modules;m++)
				{
					for(int j1=1;j1<rowsNumber;j1++)
					{

						limit[j1]+=moduleArray[m].L[i[m]][j1-1];
						numberOfAdditionOperations++;
					}
				}
				bool ok=true;
				for(int j=1;j<rowsNumber;j++)
				{
					if(conditionalMatrix[(j)*columnsNumber+columnsNumber-2]==1 && limit[j]<=conditionalMatrix[(j)*columnsNumber+columnsNumber-1]) continue;
					else
						if(conditionalMatrix[(j)*columnsNumber+columnsNumber-2]==0 && limit[j]>=conditionalMatrix[(j)*columnsNumber+columnsNumber-1]) continue;
						else
							ok = false;
				}

				if(ok)
				{
					max=sum;
					min=sum;
					GetTempResultVector2(moduleArray, tempResultingVector,i);
				}

				i[cycle]++;
			}
			else
				i[cycle]++;
		}
}
Нужно было использовать цикл while вместо for и использовать массив индексов, которые перебираются, тогда присвоение удается
aleksey95 вне форума Ответить с цитированием
Старый 24.07.2021, 22:38   #14
aleksey95
 
Регистрация: 20.07.2021
Сообщений: 9
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Пример с рекурсией:
Спасибо!
aleksey95 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход из глубоко вложенных циклов SAMOUCHKA Общие вопросы C/C++ 6 08.09.2013 21:00
Программа си ++ с использованием вложенных циклов. misha.markov Помощь студентам 0 08.11.2012 19:57
Программирование вложенных циклов vanek1 Помощь студентам 2 28.11.2010 12:11
с использованием вложенных циклов вкусняшка Помощь студентам 4 31.03.2009 17:22
переменное число вложенных циклов Evil Sun Общие вопросы C/C++ 4 31.03.2009 09:59