【问题标题】:How can I eliminate tail recursion in the following function (from two recursive calls to one)?如何消除以下函数中的尾递归(从两个递归调用到一个)?
【发布时间】:2020-06-18 11:14:13
【问题描述】:

我有以下功能:

void treetraverse (tnode *node)
{
   if (node == NULL)
   {
      return;
   }
   fprintf(stdout,"%d",node->val);
   if (node-> d == 'L')
   {
      treetraverse(node->r);
      treetraverse(node->l);
    }
    else
    {
      treetraverse(node->l);
      treetraverse(node->r);
     }
}

其中 d 是方向,可以是“L”或“R”。而 node->r 和 node->l 分别是节点的左右子节点。我试图从中删除尾递归,以便它在功能上是等效的 - 它现在进行两个递归函数调用,但我希望它进行一个。如何重写函数以实现此目标?谢谢。

【问题讨论】:

  • 你的问题与尾递归无关。
  • 因为你必须决定顺序,而且由于有左和右,你必须使用两个调用。所以你不能消除一个。
  • 如果你有一个父指针,你可以消除递归并直接遍历树。
  • @PaulOgilvie 好吧,第二个调用是尾递归...

标签: c recursion binary-tree tail-recursion tree-traversal


【解决方案1】:

最直接的方法是

void treetraverse (tnode *node)
{
  do
  {

   if (node == NULL)
   {
      return;
   }
   fprintf(stdout,"%d",node->val);

   tnode *node1;
   tnode *node2;

   if (node-> d == 'L')
   {
      node1 = node->r;
      node2 = node->l;
    }
    else
    {
      node1 = node->l;
      node2 = node->r;
     }

    treetraverse(node1);
    node = node2;

    }
    while (true);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    相关资源
    最近更新 更多