【发布时间】:2018-03-21 03:23:21
【问题描述】:
以下递归方法旨在为给定整数生成斐波那契数(用 Java 编写)
public static long fib(int n)
{
if (n == 0)
return (long)0;
else if (n == 1)
return (long)1;
else
return fib(n - 1) + fib(n - 2);
}
但我发现,在第 48 位或更高的位置生成斐波那契数需要 20 多秒。你能帮忙解释一下为什么这个 Fib 生产者效率这么低吗?
例如,这里我附上一个简单的测试客户端:
public static void main(String[] args)
{
int hi = 50;
System.out.println("Sequance, elapsed time, number");
for (int n = 0; n<= hi; n++)
{
long start = System.currentTimeMillis();
long fib_num = fib(n);
long end = System.currentTimeMillis();
long elapse = (end-start)/1000;
System.out.printf("%d, %d, %d%n", n, elapse, fib_num);
}
}
它的输出是(在 i7、4 核 MacBook Pro 2017 型号上运行):
Sequance, elapsed time, number
0, 0, 0
1, 0, 1
2, 0, 1
3, 0, 2
4, 0, 3
5, 0, 5
6, 0, 8
7, 0, 13
8, 0, 21
9, 0, 34
10, 0, 55
11, 0, 89
12, 0, 144
13, 0, 233
14, 0, 377
15, 0, 610
16, 0, 987
17, 0, 1597
18, 0, 2584
19, 0, 4181
20, 0, 6765
21, 0, 10946
22, 0, 17711
23, 0, 28657
24, 0, 46368
25, 0, 75025
26, 0, 121393
27, 0, 196418
28, 0, 317811
29, 0, 514229
30, 0, 832040
31, 0, 1346269
32, 0, 2178309
33, 0, 3524578
34, 0, 5702887
35, 0, 9227465
36, 0, 14930352
37, 0, 24157817
38, 0, 39088169
39, 0, 63245986
40, 0, 102334155
41, 0, 165580141
42, 1, 267914296
43, 2, 433494437
44, 3, 701408733
45, 5, 1134903170
46, 8, 1836311903
47, 14, 2971215073
48, 22, 4807526976
49, 34, 7778742049
50, 58, 12586269025
【问题讨论】:
-
因为递归斐波那契是效率低下。做一些分析,比如fib(8),看看到底是什么原因。