Что-то у меня затык произошел. Никак не могу сообразить, как написать алгоритм перебора с переменным количеством параметров. Т.е. требуется получить таблицу значений функции f(x1, x2...) для всех целых xi, заданных на определенном диапазоне. Притом, количество переменных (imax) заранее не известно.
Подкиньте идею, желательно в коде на "C" (не С++). И, если можно, без рекурсии.
Здравствуйте, Alick, Вы писали:
A>Что-то у меня затык произошел. Никак не могу сообразить, как написать алгоритм перебора с переменным количеством параметров. Т.е. требуется получить таблицу значений функции f(x1, x2...) для всех целых xi, заданных на определенном диапазоне. Притом, количество переменных (imax) заранее не известно.
A>Подкиньте идею, желательно в коде на "C" (не С++). И, если можно, без рекурсии.
Многоразрядный счетчик
// типа абстракция задачи :)
int n;
int lbound[n];
int ubound[n];
int x[n]; // текущие значения; lbound[i] <= x[i] < ubound[i]
void f(int *x); // передаем внутрь массив длины n
///////////////////////////////////
void init()
{
int i;
for(i = 0; i < n; ++i)
x[i] = lbound[i];
}
int step() // 0 -- дальше некуда
{
for(i = 0; i < n; ++i)
{
if(++x[i] < ubound[i])
return 1;
x[i] = lbound[i];
// перенос в следующий разряд
}
return 0; // переполнение
}
void run()
{
init();
do
{
f(x);
}
while(step());
}
Если хочется — функции init(), step() можно заинлайнить внутри run().
Спасибо большое, все работает.
К>Многоразрядный счетчик 
Это "официальное" название?
Здравствуйте, Alick, Вы писали:
К>>Многоразрядный счетчик
A>Это "официальное" название?
А бог его знает. Вообще-то, это действительно каскад счетчиков:
R--+-------------+--
| |
| +-+--+-+ | +-+--+-+
| | | | | | | | | |
+-->R| |1*- +-->R| |1*-
| | |2*- | | |2*-
T----->T| |4*- +-->T| |4*-
| | |8*- | | | |8*-
| | | | | | | | |
| | |C*---+ | | |C*--
| | | | | | | |
+-+--+-+ +-+--+-+