我在确定简单递归方法的大O时遇到了困难,我无法理解当一个方法被多次调用时会发生什么。我想更具体地说明我的困惑,但现在我正在尝试回答一些作业问题,为了不想作弊,我要求回复此帖子的任何人都提供一个简单的递归方法并提供该方法的大O的简单解释。(最好用我正在学习的Java语言...)
谢谢。
我在确定简单递归方法的大O时遇到了困难,我无法理解当一个方法被多次调用时会发生什么。我想更具体地说明我的困惑,但现在我正在尝试回答一些作业问题,为了不想作弊,我要求回复此帖子的任何人都提供一个简单的递归方法并提供该方法的大O的简单解释。(最好用我正在学习的Java语言...)
谢谢。
你也可以递归地定义顺序。例如,假设你有一个函数 f,计算 f(n) 需要 k 步。现在你想计算 f(n+1)。假设 f(n+1) 调用 f(n) 一次,则 f(n+1) 需要 k + 一些常数步骤。每次调用都需要额外的一些常数步骤,因此该方法的时间复杂度为 O(n)。
现在再看另一个例子。假设你通过将前两个结果相加来朴素地实现 fibonacci:
fib(n) = { return fib(n-1) + fib(n-2) }
现在假设你可以在约k个步骤内计算出fib(n-2)和fib(n-1)的值。为了计算fib(n),你需要2*k个步骤。现在假设你想要计算fib(n+1),那么你需要的步骤数是fib(n-1)的两倍,因此这似乎是O(2^N)。
诚然,这并不是非常正式,但希望通过这种方式你可以有一些感觉。
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))