我如何实现一个没有循环,时间复杂度为O(n)的递归斐波那契函数?
我如何实现一个没有循环,时间复杂度为O(n)的递归斐波那契函数?
通常我不会支持像这样发布作业问题的答案,但是迄今为止发布的所有内容似乎都过于复杂化了。正如上面的评论所说,您只需像迭代方式一样使用递归来解决问题即可。
以下是迭代解决方案:
def fib(n):
a, b = 0, 1
while n > 0:
a, b = b, a+b
n -= 1
return a
这里是一个等效的递归解决方案:
def fib(n):
def fib_help(a, b, n):
return fib_help(b, a+b, n-1) if n > 0 else a
return fib_help(0, 1, n)
注意,在这两种情况下,我们实际上计算到 Fn+1,但将 Fn 作为结果返回。这与您收到的“提示”非常相符。def fib(n, a=0, b=1):
,则不需要使用fib_help
函数。翻译后的代码是:return fib(n-1, b, a+b) if n > 0 else a
。 - gens如果有人正在寻找JavaScript解决方案:
function _fib(n, left, right) {
switch (n) {
case 0: return 0
case 1: return right
default: return _fib(n - 1, right, left + right)
}
}
function fib(n) {
return _fib(n, 0, 1)
}
case 0: return left
- Olivier Boissé查找第n个斐波那契数列数字的Scala代码。 了解尾递归的更多信息请参见http://nerds.logdown.com/posts/1406258-n-th-fibonacci-number。
object Main {
def main(args: Array[String]) {
println(fib(9));
println(fib(8));
println(fib(7));
println(fib(6));
println(fib(5));
println(fib(4));
println(fib(3));
println(fib(2));
println(fib(1));
println(fib(0));
}
def fib(n: Int): Int = {
def fib(n: Int, p :Int, c: Int): Int ={
if (n == 0) return -1; // undefined
if (n == 1) return p;
fib(n-1, c, p + c)
}
fib(n, 0, 1);
}
}
memoryMap[n]
func fib(int n)
if (n is in memoryMap) then
return memoryMap[n]
if (n <= 1) then
memoryMap[n] = n
else
memoryMap[n] = fib(n-1) + fib(n-2)
return memoryMap[n]
n
个递归调用,应该适合 fib
的堆栈。将其与朴素递归 fib(n) = fib(n-1) + fib(n-2) if n >1 else n
进行比较。 - kap