我有两段代码来计算给定指数的斐波纳契数列.一个使用递归,另一个使用array.它运行这两个函数,并 echo 计算每个函数所需的时间:
<?php
//Calculate the index recursively
function fibonacciRecursiveAtIndex($num){
$num = 0 and $num = 1
if($num == 0){
return 0;
} else if ($num == 1){
return 1;
} else {
return fibonacciRecursiveAtIndex($num-1) + fibonacciRecursiveAtIndex($num-2);
}
}
//Calculate non-recursively
function fibonacciAtIndex($num){
$fibonacciArray = [0, 1];
for($i = 2; $i < $num + 1; $i++){
array_push($fibonacciArray, $fibonacciArray[$i - 1] + $fibonacciArray[$i - 2]);
}
return $fibonacciArray[$num];
}
//Recursion becomes noticeably slower for an index value above 15
$indexToCalculate = 40;
//Plug index into the fibonacciRecursiveAtIndex() function and output calculation time.
$timeStart = microtime(true);
$valueAtIndex = fibonacciRecursiveAtIndex($indexToCalculate);
$timeEnd = microtime(true);
echo "Recursive(" . $indexToCalculate . ") = " . $valueAtIndex . " -- calculated in " . round(($timeEnd - $timeStart),7) . " s";
echo "<br><br>";
//Plug index into the fibonacciAtIndex() function and output calculation time.
//The calculated time is several orders of magnitudes faster for large indices (index > 15).
$timeStart = microtime(true);
$valueAtIndex = fibonacciAtIndex($indexToCalculate);
$timeEnd = microtime(true);
echo "Fibonacci(" . $indexToCalculate . ") = " . $valueAtIndex . " -- calculated in " . round(($timeEnd - $timeStart),7) . " s";
运行此命令以计算索引为40的fibonaci序列需要大约4秒的递归时间,但数组方法计算索引为40的时间与计算索引为4的时间大致相同(即,在微秒量级上).
这种行为背后的原则是什么?它在这里是如何应用的?