⼀、斐波那契数列
本文使用php演示斐波那契数列解法的三种方式, 有一定的演进规律. 阅读时需要自己去体会.
1、暴⼒递归 斐波那契数列的数学形式就是递归的,写成代码就是这样
$start_time = microtime(true);
function fib($n) {
if ($n === 1 || $n === 2) {
return 1;
}
return fib($n - 1) + fib($n - 2);
}
$f = fib(20);
echo $f;
echo '<hr/>';
$end_time = microtime(true);
var_dump('耗时 = ' . (($end_time - $start_time) * 1000) . 'ms');
var_dump('Now memory_get_usage: ' . memory_get_usage() . ' b');
输出结果:
6765
string(26) "耗时 = 9.2761516571045ms"
string(29) "Now memory_get_usage: 400112 b"
2、带备忘录的递归解法
$memo_arr = [];
$start_time = microtime(true);
function fib($n) {
if ($n < 1) {
return 0;
}
// 备忘录全初始化为 0
$arr = [];
// 初始化最简情况
return helper($arr, $n);
}
function helper(&$arr, $n) {
if ($n === 1 || $n === 2) {
return 1;
}
// 已经计算过
if ($arr[$n]) {
//var_dump('$n = ' . $n . ' $arr[$n] = ' . $arr[$n]);
return $arr[$n];
} else {
$arr[$n] = helper($arr, $n - 1) + helper($arr, $n - 2);
}
return $arr[$n];
}
$f = fib(20);
echo $f;
echo '<hr/>';
$end_time = microtime(true);
var_dump('耗时 = ' . (($end_time - $start_time) * 1000) . 'ms');
var_dump('Now memory_get_usage: ' . memory_get_usage() . ' b');
输出结果:
6765
string(26) "耗时 = 0.1218318939209ms"
string(29) "Now memory_get_usage: 402576 b"
3、dp 数组的迭代解法
$start_time = microtime(true);
function fib($n) {
if ($n === 2 || $n === 1) {
return 1;
}
$prev = 1;
$curr = 1;
for ($i = 3; $i <= $n; $i++) {
$sum = $prev + $curr;
$prev = $curr;
$curr = $sum;
}
return $sum;
}
$f = fib(20);
echo $f;
echo '<hr/>';
$end_time = microtime(true);
var_dump('耗时 = ' . (($end_time - $start_time) * 1000) . 'ms');
var_dump('Now memory_get_usage: ' . memory_get_usage() . ' b');
输出结果:
6765
string(28) "耗时 = 0.033855438232422ms"
string(30) "Now memory_get_usage: 400528 b"