主页/PHP笔记/PHP问答/数字与字符串/如何在PHP中计算斐波那契数列

如何在PHP中计算斐波那契数列

小赵码狮

小赵码狮

在PHP中计算斐波那契数列可以通过递归、迭代或矩阵乘法的方法实现。下面是一些常见的方法及其示例代码。

1. 递归方法

function fibonacci($n) {
    if ($n <= 0) {
        return "输入的数字必须大于0";
    } elseif ($n == 1 || $n == 2) {
        return 1;
    } else {
        return fibonacci($n - 1) + fibonacci($n - 2);
    }
}

// 示例:计算斐波那契数列第10项
echo fibonacci(10); // 输出: 55

2. 迭代方法

function fibonacci($n) {
    if ($n <= 0) {
        return "输入的数字必须大于0";
    }

    $a = 0;
    $b = 1;
    for ($i = 2; $i <= $n; $i++) {
        $temp = $a + $b;
        $a = $b;
        $b = $temp;
    }

    return $b;
}

// 示例:计算斐波那契数列第10项
echo fibonacci(10); // 输出: 55

3. 矩阵乘法方法

斐波那契数列也可以通过矩阵乘法来高效计算。以下是一个示例:

function matrixMultiply($A, $B) {
    $result = array();
    for ($i = 0; $i < count($A); $i++) {
        for ($j = 0; $j < count($B[0]); $j++) {
            $sum = 0;
            for ($k = 0; $k < count($A[0]); $k++) {
                $sum += $A[$i][$k] * $B[$k][$j];
            }
            $result[$i][$j] = $sum;
        }
    }
    return $result;
}

function fibonacciMatrix($n) {
    if ($n <= 0) {
        return "输入的数字必须大于0";
    }

    if ($n == 1 || $n == 2) {
        return 1;
    }

    $F = array(array(1, 1), array(1, 0));
    $result = array(array(1, 0), array(0, 1));

    while ($n > 0) {
        if ($n % 2 == 1) {
            $result = matrixMultiply($result, $F);
        }

        $F = matrixMultiply($F, $F);
        $n >>= 1;
    }

    return $result[0][0];
}

// 示例:计算斐波那契数列第10项
echo fibonacciMatrix(10); // 输出: 55

这些方法各有优缺点,选择哪种方法取决于具体的应用场景和性能需求。

小马讲师

小马讲师

介绍

斐波那契数列以其命名,由意大利数学家莱昂纳多·斐波那契(Leonardo Fibonacci)所著《计算之书》中提出。在PHP中,可以通过多种方式生成这个序列,包括迭代、递归和使用闭合形式表达式。我们将探讨多个实现方法,以演示如何在PHP中计算斐波那契数,并分析它们的效率以及每个方法的最佳应用场景。

基本递归方法

<?php
function fibonacciRecursive($n)
{
    if ($n <= 1) {
        return $n;
    } else {
        return fibonacciRecursive($n - 1) + fibonacciRecursive($n - 2);
    }
}

// Example usage
echo fibonacciRecursive(10); // Output: 55
?>

这个基本的递归函数是对斐波那契数列定义的一种直接翻译,但这种方法对于大数字来说非常不高效,因为它的计算时间复杂度是由重复计算相同的斐波那契数引起的。

迭代方法

<?php
function fibonacciIterative($n)
{
    $fib = [0, 1];
    for ($i = 2; $i <= $n; $i++) {
        $fib[$i] = $fib[$i - 1] + $fib[$i - 2];
    }
    return $fib[$n];
}

// Example usage
echo fibonacciIterative(10); // Output: 55
?>

这种迭代方法比递归方法更高效,因为它通过避免重复计算将时间复杂度降低到线性级别。它通过循环和存储中间结果数组的方式构建斐波那契数列。

记忆方法(自顶向下动态规划)

<?php
function fibonacciMemoized($n, &$memo = array())
{
    if ($n <= 1) {
        return $n;
    }
    if (!isset($memo[$n])) {
        $memo[$n] = fibonacciMemoized($n - 1, $memo) + fibonacciMemoized($n - 2, $memo);
    }
    return $memo[$n];
}

// Example usage
echo fibonacciMemoized(10); // Output: 55
?>

这种方法,也称为自顶向下动态规划方法,增加了记忆机制到基本递归方法中。它通过在数组中存储之前计算的斐波那契数来避免重复计算,并在需要时重新使用它们。

动态规划方法(自底向上的表征)

<?php
function fibonacciDP($n)
{
    if ($n <= 1) {
        return $n;
    }
    $fib = [0, 1];
    for ($i = 2; $i <= $n; $i++) {
        $fib[$i] = $fib[$i - 1] + $fib[$i - 2];
    }
    return $fib[$n];
}

// Example usage
echo fibonacciDP(10); // Output: 55
?>

这种方法类似于迭代方法,但它是一种基于记忆的逆向方法。与从顶部开始不同,它从基例向上构建解决方案,因此这种方法本质上与迭代法相似,通常可以互换使用,区别在于视角的不同。

计算斐波那契数列的公式为Binet’s formula。

<?php
function fibonacciBinet($n)
{
    $sqrt5 = sqrt(5);
    $phi = (1 + $sqrt5) / 2;
    return round(pow($phi, $n) / $sqrt5);
}

// Example usage
echo fibonacciBinet(10); // Output: 55
?>

布林特公式允许通过求解一个封闭形式的表达式来找到第 n 个斐波那契数,而无需迭代或递归。它利用黄金比例和根号 5 计算该数字,但因为使用浮点数运算,对于非常大的值 ‘n’,可能会出现精度问题。

结论。

PHP 提供了多种方法来计算斐波那契数,从基本的递归函数到复杂的数学表达式如贝祖氏公式。在选择合适的算法时,请考虑代码简洁性和性能之间的权衡,特别是在计算大量斐波那契数时。一般来说,避免使用简单的递归方法处理大型序列,并优先推荐迭代或动态编程方法以保持性能。