我是这么实现斐波那契数列的

2017 年 1 月 3 日
 Jakesoft

实习时面试面到这个问题,当时还不知道斐波那契数列,讲给同学听时,他说,这不就是斐波那契数列吗?! (尴尬脸)

然后这是我面试的回答:

$total = [0, 1];

for ($i = 2; $i < 100; $i++)
{
	$total[] = $total[$i - 1] + $total[$i - 2];
}

今天看到别人(书本)的实现,需要定义几个变量来交换当前值、上一个值,感觉好麻烦。

还有我的代码应该没啥问题吧

6824 次点击
所在节点    PHP
48 条回复
laoyuan
2017 年 1 月 3 日
新年刚开始又来黑 PHP 。。总之不用递归都是好的
superYy
2017 年 1 月 3 日
性能低!应该创建一个缓冲数组存贮之前的值
misaka19000
2017 年 1 月 3 日
还行,不过不是非得用数组吧
GPIO
2017 年 1 月 3 日
中学学数列的时候都会讲到斐波那契数列的啊,你是不是当时没好好听课。。。
superYy
2017 年 1 月 3 日
@superYy 没仔细看,之前说错了
gisonrg
2017 年 1 月 3 日
不用数组只用两个变量可以省空间→_→
mrgeneral
2017 年 1 月 3 日
算法没啥问题啊。

前面的存下来没啥意义, echo 输出了吧,换成俩变量,节省空间。
SteveLee
2017 年 1 月 3 日
矩阵快速 mi
dtfm
2017 年 1 月 3 日
fib 不应该这样么? a, b = b , a+b
em2046
2017 年 1 月 3 日
没毛病
为啥不用递归呢
PS :递归也可以不是 O(2^n)
akira
2017 年 1 月 3 日
没问题。只是当 N 比较大的时候,会略尴尬
q397064399
2017 年 1 月 3 日
@em2046 空间复杂度为 O(2^n) 递归过深,直接爆栈,所以才有了 stackoverflow.com
q397064399
2017 年 1 月 3 日
@em2046 递归调用每一次 call ,按照计算机的函数堆栈模型,栈帧要向下延伸,然后栈容量不够用的时候,就直接爆了
q397064399
2017 年 1 月 3 日
一般问菲波那切数列的话,都会接着问 栈溢出的问题,
如果不知道函数递归调用过深导致的爆栈问题,就会略显尴尬了
loggerhead
2017 年 1 月 3 日
可以看看我这篇文章——求 Fibonacci 数列的 N 种算法: https://loggerhead.me/posts/qiu-fibonacci-shu-lie-de-n-chong-suan-fa.html
xjp
2017 年 1 月 3 日
没有问题
assad
2017 年 1 月 3 日
import numpy

def mm_fib(n):
return (numpy.matrix([[2,1],[1,1]])**(n//2))[0,(n+1)%2]

[mm_fib(i) for i in range(20)]
Kilerd
2017 年 1 月 3 日
@loggerhead

> 重复平方技术也可以用在求 Fibonacci 数上。

可行吗?? 我想了一下,好像没有什么思路。 求指点。
loggerhead
2017 年 1 月 3 日
@Kilerd 文章中有写。比如: 2^8 = 2^4 * 2^4 就只用算一次 2^4 和一次乘法,时间复杂度降到了 O(logn)
Contextualist
2017 年 1 月 3 日
@Kilerd 文章中下面的矩阵乘法和代数方法就是“重复平方”(其实就是乘法结合律)的具体实现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/331932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX