是否存在没有递归形式的算法特征?

时间:2018-02-08 16:06:43

标签: algorithm recursion

这个问题来自二叉树表示(前序,后序,级别顺序等)。其中一些可以以递归形式(例如前序表示)编写,但我认为没有水平顺序表示的递归算法(或者,如果你知道如何做,请告诉我!)。所以我的问题是:是否存在无法以递归形式编写的“类型”算法?如果是这样,那么如何表征这种类型的算法呢?(或者是否有一个系统可以编写证明某些算法不能以递归方式编写?)

3 个答案:

答案 0 :(得分:1)

我不一定认为这是this question的副本,但它是一个很好的参考。它提供了一个证明,表明每个迭代算法都可以递归编写。出于这个原因,没有一类算法没有递归形式。

答案 1 :(得分:0)

while Condition do Statement end 

可以等效编写

to Perform():
    if Condition then Statement; Perform() end

并且所有顺序程序都可以递归重写,无需循环。

答案 2 :(得分:0)

从基本案例开始递归。如果最终结果来自基本情况,则算法具有递归形式。递归算法通常采用F(n) = G( F(n-1 ) ... )形式。示例是Fibonacci系列。 F(n) = F(n-1) + F(n-2)。这自然会变成递归形式。

您的问题似乎更多是关于算法的实现。 每个递归算法都可以递归和非递归地实现。 因为递归固有地使用函数堆栈。您可以在非递归形式的实现中明确使用相同的堆栈。

因此,您可以使用递归和非递归形式轻松实现预订,后订购。

进入关卡顺序,我相信你也可以以递归形式实现它。例如(可能不是完全正确的形式)。

void printLevelOrder( int level, Queue<Node> q ) {

    if ( !q.isEmpty() ) {
      Node curr = q.peek();
      int size = q.size();
      System.out.print( "At level " + level + " : " );
      for ( int i = 0; i < size; i++ ) {
         System.out.println( q.poll().toString() );
      }
      for ( Node child : curr.children() ) {
        q.add( child );
      }
    }
    printLevelOrder( level + 1, q );
 }

但重点是实现和算法的数学形式是不同的。