由斐波纳契数列衍生出来的斐波纳契数列

斐波纳契(Fibonacci)数列:算法

0, 1, 1, 2, 3, 5, 8, 13, 21…函数

01开始,而且后面的每一个斐波纳契数是前两个斐波纳契数之和。字体

斐波纳契数列能够递归定义:spa

Fibonacci0= 0递归

Fibonacci1= 1ci

Fibonaccin= Fibonacci(n-1) + Fibonacci(n-2)table

使用递归算法的Java代码以下:ast

public long fibonacci(long n)im

{img

if(n==0||n==1)

   return n;

else

  return fibonacci(n-1) + fibonacci(n-2)

}

在这里有个有趣的问题:

假如计算fibonacci(3)时,会产生2个递归调用; fibonacci(2)fibonacci(1)以下图:

进行简化以下:

从上图中能够清楚的看到使用递归算法计算fibonacci3)一共进行了5次递归调用;

那么计算fibonacci20)、fibonacci30)、又要递归多少次呢?

假如计算fibonacci31)须要调用4356617次,计算fibonacci32)须要7049155次,能够看出递归计算斐波那契数列,对函数的调用是爆炸式的,相邻的第3132个斐波那契数就增加了664080次。

n

0

1

2

3

4

5

6

7

8

9

fibonaccin

0

1

1

2

3

5

8

13

21

34

那么再列出fibonacci(4)的图

一共调用5+3+1=9

n

0

1

2

3

4

5

6

7

8

9

fibonaccin

0
1

1
0

1
2

2
3

3

6

5

19

8
17

13
28

21
46

34
75

次数count(n)

1

1

3

5

9

15

25

41

67

109

红色字体为调用次数与计算fibonaccin)的值之差。

能够获得差值和调用次数分别遵循以下斐波那契函数:

差值:

Difference (0) = 1

Difference (1) = 0

Difference (n) = Difference (n-1) +  Difference (n-2) + 1

调用次数;

Count (0) = 1

Count (1) = 1

Count (n) = Count (n-1) +  Count (n-2) + 1

相关文章
相关标签/搜索