Recursion 递归方法的大O

Recursion 递归方法的大O,recursion,big-o,Recursion,Big O,我很难确定简单递归方法的大O。我不知道当一个方法被多次调用时会发生什么。我会更具体地说明我的困惑,但目前我正试图回答一些硬件问题,为了不想作弊,我要求任何回复本文的人提出一个简单的递归方法,并对所述方法的大O提供一个简单的解释。(最好是用我正在学习的Java语言。) 谢谢。您也可以递归地定义顺序。例如,假设你有一个函数f。计算f(n)需要k步。现在要计算f(n+1)。假设f(n+1)调用f(n)一次,然后f(n+1)采取k+一些恒定的步骤。每次调用都会采取一些额外的常量步骤,因此此方法是O(n)

我很难确定简单递归方法的大O。我不知道当一个方法被多次调用时会发生什么。我会更具体地说明我的困惑,但目前我正试图回答一些硬件问题,为了不想作弊,我要求任何回复本文的人提出一个简单的递归方法,并对所述方法的大O提供一个简单的解释。(最好是用我正在学习的Java语言。)


谢谢。

您也可以递归地定义顺序。例如,假设你有一个函数f。计算f(n)需要k步。现在要计算f(n+1)。假设f(n+1)调用f(n)一次,然后f(n+1)采取k+一些恒定的步骤。每次调用都会采取一些额外的常量步骤,因此此方法是O(n)

现在看另一个例子。假设您通过添加前面的两个结果天真地实现了斐波那契:

fib(n) = { return fib(n-1) + fib(n-2) }
现在假设你可以用大约k步计算fib(n-2)和fib(n-1)。要计算fib(n),需要k+k=2*k步。现在假设你想计算fib(n+1)。所以你需要两倍于fib(n-1)的步骤。这似乎是O(2^N)


诚然,这不是很正式,但希望通过这种方式你能有一点感觉。

你可能想参考寻找递归方法大O的主定理。以下是维基百科的文章:

你想把递归问题想象成一棵树。然后,考虑树的每一级和所需的工作量。问题通常分为三类,根重(第一次迭代>>树的其余部分)、平衡(每个级别的工作量相等)、叶重(最后一次迭代>>树的其余部分)

以合并排序为例:

define mergeSort(list toSort):
    if(length of toSort <= 1):
        return toSort
    list left = toSort from [0, length of toSort/2)
    list right = toSort from [length of toSort/2, length of toSort)
    merge(mergeSort(left), mergeSort(right))
定义合并排序(列表到排序):

如果(toSort的长度实际上与递归无关,而与大O表示法有关。如果可以递归编写,就可以编写它iteratively@MStodd不一定。尝试迭代遍历二叉树。@Drise您可能需要一个堆栈,但这是可能的。递归只是将堆栈隐藏在调用堆栈中。@Drise稍后。重点是帮助OP完善他们的问题。这可能是一个很好的概念化方法的重复。再次,我会投票支持你——但我还没有到15分。在这里添加一个有用的链接:我会投票支持你,但我的声誉还不够高。这确实有帮助。我将关注主定理。谢谢。@user1333461如果这是帮助的话请接受他的回答。