Есть ли способ преобразовать эти циклы в рекурсивные?
Я не знаю об автоматизированном механизме ... но, поскольку ваш пост с вложенными циклами достаточно прост,ручное преобразование просто.
Возможно, вы ищете руководство по шаблону?Так как же выглядит простой рекурсивный цикл?
Вы пометили этот пост как C ++, так что здесь мое предложение использует функторы, которые являются упрощенным классом.Компилятор использования этих функторов предоставил значения по умолчанию для ctor и dtor, которые ничего не делают (быстро).
Ниже, в функторе "Functor_TailRecursion_t", каждый цикл for сообщения был заменен рекурсивной функцией, именемкоторый отражает цикл for из оригинального поста.Таким образом, void r_k () {...} "выполняет цикл for (int k = 0; k <2; k ++) {...}. </p>
Обратите внимание, что каждыйфункций Functor не передают никаких параметров ... кроме скрытого параметра this. Это уменьшает автоматическое использование памяти при глубоких рекурсиях (которых в этом примере нет).
Примечаниечто все рекурсивные функции 'Functor' являются хвостовой рекурсией. Компилятор может оптимизировать хвостовую рекурсию для итеративной производительности, хотя я не проверял этот код.
Помните, что хотя компиляторБлагодаря встроенным функциям небольшого класса рекурсивные вызовы предотвратят это.
Удачи в ваших усилиях.
#include <iostream>
using std::cout, std::endl, std::flush;
#ifndef DTB_PCKLRT_HH
#include "../../bag/src/dtb_pclkrt.hh"
using DTB::PClk_t;
#endif
// postfunction (extracted from main)
void function_NestedForLoops()
{
for(int i=0;i<2;i++)
{
for(int k=0;k<2;k++)
{
for(int t=0;t<2;t++)
{
for(int p=0;p<2;p++)
{
cout<<i<<k<<t<<p<<endl;
}
}
}
}
} // void function_NestedForLoops()
// functor, tail recursion
class Functor_TailRecursion_t
{
int i {0}, k {0}, t {0}, p {0}; // value-initialization
public:
void operator()() { r_i(); } // enter recursion
private:
void r_i() { if (!(i < 2)) { i = 0; return; } r_k(); ++i; r_i(); }
void r_k() { if (!(k < 2)) { k = 0; return; } r_t(); ++k; r_k(); }
void r_t() { if (!(t < 2)) { t = 0; return; } r_p(); ++t; r_t(); }
void r_p() { if (!(p < 2)) { p = 0; return; } show(); ++p; r_p(); }
void show() { cout << "\n " << i << k << t << p << flush; };
}; // class Functor_TailRecursion_t
class F808_t // ctor and dtor: compiler provided (do-nothing) defaults
{
PClk_t pclk; // posix clock access
public:
int operator()()
{
int retVal = 0;
uint64_t start_ns = pclk.ns();
cout << "\n\nfunction, nested for loops:\n";
function_NestedForLoops();
cout << "\n functor, tail recursion: ";
Functor_TailRecursion_t()();
auto duration_ns = pclk.ns() - start_ns;
cout << "\n\n F808_t::operator()() duration " << duration_ns
<< " ns (" << __cplusplus << ")" << std::endl;
return retVal;
}
}; // class F808_t
int main(int, char**) { return F808_t()(); }