C++用于理顺递归的模板技术

C++ template techniques for straightening out recursion?

本文关键字:技术 递归 用于 C++      更新时间:2023-10-16

>假设我有一个具有自然递归的函数,但出于多种原因我想避免执行递归。是否有任何好的方法可以在C++应用模板来系统地重塑代码执行以避免递归的可能危害?


举个例子,我们可以假设T1T2是一些类型和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;
 }

在这种情况下,模板方面(T1T2)独立于递归/非递归方面:在非递归函数中有用 如果在递归版本中有用。