龙空技术网

斐波那契数列的两种实现

算法集市 1664

前言:

当前小伙伴们对“斐波那契数列php递归算法”大致比较珍视,姐妹们都需要剖析一些“斐波那契数列php递归算法”的相关知识。那么小编也在网络上收集了一些有关“斐波那契数列php递归算法””的相关资讯,希望兄弟们能喜欢,大家快快来了解一下吧!

1、斐波那契数列

最先研究这个数列的人是意大利人斐波那契,Leonardo Fibonacci,他在描述兔子生长的数目时用上了这数列:

第一个月初有一对刚诞生的兔子;第二个月还是只有这一对;第三个月初它们可以生育;以后每月每对可生育的兔子会诞生下一对新兔子;兔子永不死去。

每个月兔子的总对数,就是这样一个序列:

1, 1, 2, 3, 5, 8, 13, 21...

这个序列从第三项开始,每一项都等于前两项之和。

在数学上,斐波那契数列是以递归的方法来定义:

F(1) = 1

F(2) = 1

F(n) = F(n-1) + F(n-2) (n≥3)

2、代码实现2.1、递归实现

根据斐波那契数列的数学定义,用递归可以很快实现,且代码简洁易懂。

int fibo(int n) {    if ((n == 1) || (n == 2)) {        return 1;    }      return (fibo(n-1) + fibo(n-2));}

递归实现虽然简洁,但却有许多重复计算,当 n 的值非常大时,重复计算的次数就会急剧增加,事实上该算法的时间复杂度随着 n 值的增加呈指数增长,其时间复杂度却为 O(2^n)。

有没有时间复杂度较低的算法呢?

2.2、循环实现

F(n) = F(n-1) + F(n-2) (n≥3)

采用递归的方式实现,有许多重复计算,这些重复计算其实是不必要的。观察斐波那契数列的数学定义,F(n) 的值只与前两项相关,对于任意一个 n 值,只要记住这两个值,并不断更新,就可以避免重复计算。

int fibo(int n) {    if ((n == 1) || (n == 2)) {        return 1;    }      int prev = 1;    int curr = 1;      for (int i = 3; i <= n; i++) {        int sum = prev + curr;        prev = curr;        curr = sum;    }      return curr;}

采用循环的方式,时间复杂度降为 O(n)。

标签: #斐波那契数列php递归算法