递归函数的复杂性

时间:2019-08-27 03:26:33

标签: recursion time-complexity

我正在阅读here所遇到的问题及其相应的解决方案。该语句如下:

  

源点(x1,y1)的坐标确定是否可以到达目标点(x2,y2)。从任何点(x,y)来看,只有两种有效的运动:   (x,x + y)和(x + y,y)。如果可能,则返回布尔值true,否则返回false。

我了解递归如何解决此问题,但我一直在考虑复杂性方面的问题。我正在考虑从(1,1)开始到任意(x,y)的最坏情况-在这种情况下有多少个递归调用?我在尝试计算递归调用的数量时遇到了困难,因此,我非常感谢对可能存在的调用数量的解释或说明。预先感谢

2 个答案:

答案 0 :(得分:1)

在不损失时间复杂度的情况下,令x1 = y1 = 1和x2 = y2 = n。

递归调用将生成一个二叉树。由于x1和y1均为1,因此在二叉树的第i个级别上,最高的x和y值将是第i个斐波那契数。由于第i个斐波那契数约为第i个幂的1.618,因此树的高度为O(log(n))。二叉树中的节点数为O(2 ^ h),其中h是树的高度,因此此算法将进行O(2 ^ log(n))个递归调用,这意味着它为O(n)。

答案 1 :(得分:0)

要为此编写一个递归算法,我们可以假设是这样的:

bool possible(Point src(x1,y1), Point dst(x2,y2))
{
    if((x1 > x2) || (y1>y2))
        return False;
    if(src == dst)
        return True;

    Point p1 = Point(x1 , x1+y1);
    Point p2 = Point(x1+y1 , y1);

    return(possible(p1,dst) || possible(p2,dst));
}

对于时间复杂度,我们需要考虑函数被调用的最大次数。如果我们考虑这棵树,那将是深度优先搜索,并且每次我们增加y的值直到它到达y > y2的地步。然后,我们回到增加x的值。我的猜测是O(max((y2-y1) , (x2-x1));因为在最坏的情况下,我们一棵接一棵地倒下,直到xy的值(取决于此处的顺序:return(possible(p1,dst) || possible(p2,dst)))大于树的对应值。 dst点。