簡體   English   中英

如何消除以下函數中的尾遞歸(從兩個遞歸調用到一個)?

[英]How can I eliminate tail recursion in the following function (from two recursive calls to one)?

我有以下功能:

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 分別是一個節點的左右子節點。 我試圖從中刪除尾遞歸,以便它在功能上等效 - 它現在進行兩次遞歸函數調用,但我希望它進行一次。 如何重寫函數以實現此目標? 謝謝你。

最直接的方法是

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM