斐波那契数列:
经典数学问题之一;斐波那契数列,又称黄金分割数列,指的是这样一个数列:
1、1、2、3、5、8、13、21、……
看到这个数列大家很容易就推算出来后面好几项的值,那么到底有什么规律,简单说,就是前两项的和是第三项的值,也许你会想到的是迭代,也许你想到的是递归。
PHP 使用递归实现斐波那契数列代码如下:
<?php
// 使用递归实现斐波那契数列
function fibon($n){
if ($n <= 2) {
return 1;
}
return fibon($n - 1) + fibon($n - 2);
}
如果把已经算过的值,保存起来下次直接用的话,递归次数就会明显减少。优化代码如下:
<?php
// 优化后的递归
function fibonac($one, $two, $n){
if ($n > 2) {
return fibonac($one + $two, $one, $n - 1);
}
return $one;
}
可以通过统计递归次数来看看两种方法递归的次数
<?php
// 使用递归实现斐波那契数列
function fibon($n){
global $num1;
$num1++;
if ($n <= 2) {
return 1;
}
return fibon($n - 1) + fibon($n - 2);
}
// 优化后的递归
function fibonac($one, $two, $n){
global $num2;
$num2++;
if ($n > 2) {
return fibonac($one + $two, $one, $n - 1);
}
return $one;
}
echo fibon(8);
echo "<br> 递归次数 $num1";
echo "<br>";
echo fibonac(1, 1, 8);
echo "<br> 递归次数 $num2";
使用迭代实现斐波那契数列
<?php
// 使用迭代
function fibonacci($n) {
$ret = [];
for ($i = 0; $i <= $n; $i++) {
if ($i == 0) {
$ret[$i] = 0;
continue;
} else if ($i == 1) {
$ret[$i] = 1;
continue;
}
$ret[$i] = $ret[$i - 1] + $ret[$i - 2];
}
return $ret[$n];
}
$n = 8;
echo fibonacci($n);
递归优化,增加内存缓存
<?php
function recursionCache($i) {
static $cache = [
1 => 1,
2 => 1,
];
if (!isset($cache[$i])) {
$cache[$i] = recursionCache($i - 2) + recursionCache($i - 1);
}
return $cache[$i];
}