由斐波納契數列衍生出來的斐波納契數列

斐波納契(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

相關文章
相關標籤/搜索