Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 具有两个输入的递归函数的运行时间_Algorithm_Recursion_Complexity Theory - Fatal编程技术网

Algorithm 具有两个输入的递归函数的运行时间

Algorithm 具有两个输入的递归函数的运行时间,algorithm,recursion,complexity-theory,Algorithm,Recursion,Complexity Theory,我一直在解决一些面试问题,进行练习,但我仍在努力确定一些递归函数的运行时间。 我要解决的问题是: 想象一个机器人坐在X×Y网格的左上角。 机器人只能向两个方向移动:向右和向下。有多少 机器人从(0,0)到(X,Y)有可能的路径吗 我的解决方案(Java): 最后一级有10个元素(返回值1),这是从(0,0)到达(3,2)的可能路径数。 根据我的直觉,我认为运行时间会随着X和Y的增加而增加: O(2^X*2^Y)=O(2^(X+Y)) 此外,我还添加了一个计数器,它随着每次递归调用而递增,以查看函

我一直在解决一些面试问题,进行练习,但我仍在努力确定一些递归函数的运行时间。 我要解决的问题是:

想象一个机器人坐在X×Y网格的左上角。 机器人只能向两个方向移动:向右和向下。有多少 机器人从(0,0)到(X,Y)有可能的路径吗

我的解决方案(Java):

最后一级有10个元素(返回值1),这是从(0,0)到达(3,2)的可能路径数。 根据我的直觉,我认为运行时间会随着X和Y的增加而增加:

O(2^X*2^Y)=O(2^(X+Y))

此外,我还添加了一个计数器,它随着每次递归调用而递增,以查看函数被调用的次数。对于上面的示例,函数被调用49次。 函数成功地将两个
if
语句传递24次,并尝试再进行两次递归调用

这使我进一步怀疑我的直觉

有人能帮我分析这个(和类似的)递归函数来确定时间复杂度吗?
我不想你们费心向我解释如何解决这个问题,但也许是一些一般性的指示或建议?谢谢。

当每个summand都是
0
1
时,求和
S
需要多少个summand?很明显,至少是
S
。因此,函数至少进行
answer
调用,其中
answer
是问题的答案。如果只返回1,否则处理0,那么这就是准确的计数


记录在案,这个问题的一个好的解决方案有很多关系(这一点可能会有所帮助)。

有一个更简单的解决方案:从(0,0)到(x,y)总共需要x+y步。在这些步骤中,你必须选择x个水平步骤的位置,你可以用二项式(x+y,x)方法来做。

很棘手,每个问题都不同。从一个电子表格开始,该表格计算呼叫次数,以了解问题


如果从X=Y>0开始,进行X+Y级别的递归调用,那么有2种方法可以选择两种递归调用中的哪一种。这些方法中的许多都不会深入到X+Y水平,因为X或Y都会变成负值。但是,如果您按照每个调用路径执行相同的次数,那么您将进入X+Y级别。有(2X/X)方法可以做到这一点,大约是2^(X+Y)/sqrt(pix)

我怀疑你所采取的方法是否符合预期。从左上角到右下角的路径总是由
X+Y
down(D)或left(L)步组成,其中
X
乘以left和
Y
乘以down。例如,对于
X=3
Y=2
,这是一个可能的路径:
LLDLD
。问题是:存在多少不同的序列?换句话说,您可以通过多少种方式从
X+Y
位置中选择
X
L
?组合数学告诉我们这是
X+Y选择X
,或者
(X+Y)/(X!Y!)
。是的,你是对的。我的解决方案就是从(X,Y)向后移动到(0,0),向左和向上移动,这与从(0,0)开始和向右和向下移动到(X,Y)相反。对于X=3和Y=2,我的解给出10。(X+Y)!/(X!Y!)会给出(5)!/(3!2!)=10在我看来就像是递归。这些增长非常快。我感谢你们提供替代解决方案。这绝对有助于我从不同的角度看待这个问题。但是,我希望找到我创建的解决方案的运行时间,特别是如果它是最优的,谢谢。这就是我想要的。你能解释一下pi*X的根从哪里来吗?这是斯特林近似的应用吗?还有,Y是如何成为2X除以X的一个术语的?是的,任何进一步的解释都是非常感谢的:)啊,找到了,你还在谈论如果X=Y;那么你给出的事实上是应用斯特林近似的结果,可以找到。
public int totalPossiblePaths(int X, int Y) {
    if(X < 0 || Y < 0) {
        return 0;
    }
    if(X == 0 && Y ==0) {
        return 1;
    }
    return totalPossiblePaths(X - 1, Y) +
           totalPossiblePaths(X, Y - 1);
}
    F(3, 2) = F(2, 2) + F(3, 1)
            = F(1, 2) + F(2, 1) + F(2, 1) + F(3, 0)
            = F(0, 2) + F(1, 1) + F(1, 1) + F(2, 0) + F(1, 1) + F(2, 0) + F(2, 0)
            = F(0, 1) + F(0, 1) + F(1, 0) + F(0, 1) + F(1, 0) + F(1, 0) + F(0, 1) + F(1, 0) + F(1, 0) + F(1, 0)
            = F(0, 0) + F(0, 0) + F(0, 0) + F(0, 0) + F(0, 0) + F(0, 0) + F(0, 0) + F(0, 0) + F(0, 0) + F(0, 0)