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

标签 c++ templates recursion design-patterns

假设我有一个自然发生递归的函数,但我想避免出于多种原因进行递归。有没有什么好的方法可以在 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;
 }

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

关于用于理顺递归的 C++ 模板技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47190539/

相关文章:

c++ - 将功能参数的参数解包到 C++ 模板类

c - 使用递归的基本转换

c++ - 有什么方法可以毫无异常(exception)地取消 boost 信号2中的信号传播?

node.js - NodeJS Express app.locals 无法在函数中直接访问

c++ - 为什么游戏不使用数学表达式模板?

swift - 如何使用递归在 Swift Playground 中打印斐波那契数列

java - 使用递归打印子字符串(void方法)

c++ - 调用 boost io_service.post 的正确方法

c++ - 模板类 vector 删除不起作用

c++ - FFmpeg 好像是版本冲突