C++用于理顺递归的模板技术
C++ template techniques for straightening out recursion?
>假设我有一个具有自然递归的函数,但出于多种原因我想避免执行递归。是否有任何好的方法可以在C++应用模板来系统地重塑代码执行以避免递归的可能危害?
举个例子,我们可以假设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++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 到连接组件算法的问题(递归)
- 如何使用递归打印修改后的星号三角形图案
- 使用递归模板动态分配的多维数组
- 递归函数有效,但无法记忆
- C++用于理顺递归的模板技术