假设我有一个自然发生递归的函数,但我想避免出于多种原因进行递归。有没有什么好的方法可以在 C++ 中应用模板来系统地 reshape 代码执行以避免可能的递归危害?
举个例子,我们可以假设 T1
, T2
是一些类型并且 start()
, end()
一些任意函数接受参数并返回各自类型的东西:
T2 recursion(T1 a1){
T1 l1 = start(a1);
if( recurse_condition(a1,l1) )
T2 l2 = recursion(l1);
else return final(a1,l1);
return end(l2);
}
因此,如果我对尾递归的理解是正确的,那么只有当 end()
函数什么都不做时才有可能执行,但我们在这里假设它可能会执行某些操作。
(我不是经常访问这个网站,所以如果问题在其他地方更合适,请随时重定向我。)
最佳答案
给定你的例子(稍微更正)
template <typename T2, typename T1>
T2 recursion(T1 a1){
T1 l1 = start(a1);
if( recurse_condition(a1,l1) )
T2 l2 = recursion<T2>(l1);
else return final(a1,l1);
return end(l2);
}
我想你可以用类似(也是 C++98)的东西来避免递归
template <typename T2, typename T1>
T2 noRecursion (T1 a1)
{
std::size_t cnt ( 0U ); // counter: how many time is
// executed `start()`
T1 l1 ( a1 );
do
{
a1 = l1;
l1 = start(a1);
++cnt;
}
while ( recurse_condition(a1, l1) );
T2 l2 ( final(a1, l1) );
// exec end() one time less than start()
while ( --cnt ) // shorter than for (auto ui = 1U ; ui < cnt ; ++ui)
l2 = end(l2);
return l2;
}
在这种情况下,模板方面(T1
和 T2
)独立于递归/非递归方面:在非递归函数中有用如果在递归版本。
关于用于理顺递归的 C++ 模板技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47190539/