Recursion 递归函数的复杂性

Recursion 递归函数的复杂性,recursion,time-complexity,Recursion,Time Complexity,我正在阅读一个我遇到的问题及其相应的解决方案。声明如下: 给定源点(x1,y1)的坐标,确定是否有可能到达目的点(x2,y2)。从任意点(x,y)开始,只有两种类型的有效运动: (x,x+y)和(x+y,y)。如果可能,则返回布尔值true,否则返回false 我理解递归是如何解决这个问题的,但我在考虑它的复杂性。我在考虑最坏的情况,从(1,1)开始到任意(x,y)-在这种情况下有多少递归调用?我在计算递归调用的数量时遇到了困难,因此我非常希望能够解释或说明调用的数量。提前感谢为此编写递归算法,

我正在阅读一个我遇到的问题及其相应的解决方案。声明如下:

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


我理解递归是如何解决这个问题的,但我在考虑它的复杂性。我在考虑最坏的情况,从(1,1)开始到任意(x,y)-在这种情况下有多少递归调用?我在计算递归调用的数量时遇到了困难,因此我非常希望能够解释或说明调用的数量。提前感谢

为此编写递归算法,我们可以假设如下:

bool可能(点src(x1,y1),点dst(x2,y2))
{
如果((x1>x2)|(y1>y2))
返回False;
如果(src==dst)
返回True;
点p1=点(x1,x1+y1);
点p2=点(x1+y1,y1);
返回(可能(p1,dst)|可能(p2,dst));
}

对于时间复杂度,我们需要考虑函数调用的最大次数。如果我们考虑树,这将是一个深度优先搜索,并且每次我们增加<代码> y>代码>值,直到它到达“代码> y> y2 < /代码>的位置。然后我们返回到增加
x
值。我的猜测是
O(max((y2-y1),(x2-x1))
;因为在最坏的情况下,我们一个接一个地沿着树往下走,直到
x
y
(取决于这里的顺序:
返回(可能(p1,dst)|可能(p2,dst))
)大于
dst
点的相应值。

在不损失其时间复杂度的一般性的情况下,设x1=y1=1,x2=y2=n


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

算法的复杂性已定义。请提供用于解决此问题的算法。描述了
O(n)
算法并提示
O(log(n))
1。但正如尤里所说,big-O符号是关于算法而不是问题的。