Algorithm 为什么斐波那契递归算法工作得太慢?

Algorithm 为什么斐波那契递归算法工作得太慢?,algorithm,recursion,Algorithm,Recursion,我正在使用递归算法,用java生成斐波那契数。 该算法比一个人简单地加上2个数字(跨越10个数字)花费了太多的时间。windows calculator甚至可以在几秒钟内完成大数的幂运算(例如:7^1000)。windows计算器和我的斐波那契算法都在同一个windows i5处理器上工作 为什么我的斐波那契算法在简单加法上花费了太多时间 fib的经典递归实现是: intfib(intn){ if(n1){//(n-->1)被解析为(n-->1) c=a+b; a=b; b=c; } 返回c;

我正在使用递归算法,用java生成斐波那契数。 该算法比一个人简单地加上2个数字(跨越10个数字)花费了太多的时间。windows calculator甚至可以在几秒钟内完成大数的幂运算(例如:7^1000)。windows计算器和我的斐波那契算法都在同一个windows i5处理器上工作


为什么我的斐波那契算法在简单加法上花费了太多时间

fib的经典递归实现是:

intfib(intn){
if(n<2)
返回n;
其他的
返回fib(n-1)+fib(n-2);
}
此函数递归次数太多,它被用作衡量各种语言中函数调用效率的简单基准,时间复杂度为O(φn)

您需要一个迭代实现,它将像一个符咒一样执行:

intfib(intn){
int a=0,b=1,c=n;
而(n-->1){//(n-->1)被解析为(n-->1)
c=a+b;
a=b;
b=c;
}
返回c;
}

斐波那契数呈指数增长,通常计算机可以在1秒内迭代10^8-10^9个n值。如果要执行递归函数,可能是函数取了很多值,因此程序执行缓慢


此外,运行时间不仅取决于处理器,还有其他各种因素(如RAM、编程语言、内存等)。为了检查程序的运行时间,使用了各种概念,如大Oh符号。

因为我们的水晶球坏了,你愿意给我们看一些你的代码吗?因为每个递归都有两条路径?监视递归函数的函数调用次数,很快就会知道原因。在经典递归版本的斐波那契函数中,加法并不耗时。事实上,
fib(10)
将两个数字相加177次以计算
55
。它呈指数级增长,因此
fib(20)
将数字相加21891次。fib(30)为计算832040做了200万次加法。好吧,没有windows处理器。@JosephJames如果有机会两次使用同一个函数,那么带记忆的递归解决方案将战胜总是这样做的迭代解决方案
O(n)