php 斐波那契数列 递归 递推

php 斐波那契数列 递归 递推

<?php

header("content-type:text/html;charset=utf-8");

class ClassFbnq{
    // 递归求和
    public function fbnq($n){
        if($n <= 0){
            return 0;
        }else if($n == 1){
            return 1;
        }else{
            return $this->fbnq($n-1) + $this->fbnq($n-2);
        }
    }
    // 递推求和
    public function recursion_fbnq($n){
        $num1 = $num2 = $temp = 1;
        for($i = 3 ; $i <= $n ; $i++){
            $temp = $num1 + $num2;
            $num1 = $num2;
            $num2 = $temp;
        }
        return $temp;
    }
    // 公式求和
    public function math_fbnq($n){
        // string pow( x , y ) - 返回 x 的 y 次方的幂。如果可能,本函数会返回 integer。 如果不能计算幂,将发出一条警告,pow() 将返回 false。
        // float  sqrt( float arg ) - 求一个数的平方根  返回 arg 的平方根。
        $a = pow((1+sqrt(5))/2,$n);
        $b = pow((1-sqrt(5))/2,$n);
        $c = sqrt(5);
        return ($a - $b)/$c;
    }
    // 数组求过程
    public function array_fbnq($n){
        $array[0] = $array[1] = 1;
        for($i = 2 ; $i < $n ; $i++){
            $array[$i] = $array[$i-1] + $array[$i-2];
        }
        // join() - 把数组元素组合为一个字符串:
        return join("&nbsp;&nbsp;",$array);
    }
}
$fbnq = new ClassFbnq();
echo "斐波那契数列 - 求和:" . $fbnq->fbnq(6) . "<hr>";
echo "斐波那契数列 - 求和(递推):" . $fbnq->recursion_fbnq(6) . "<hr>";
echo "斐波那契数列 - 求和(公式):" . $fbnq->math_fbnq(6) . "<hr>";

echo "斐波那契数列 - 过程(横排):" ;
for($i = 1 ; $i <= 6 ; $i++){
    echo $fbnq->fbnq($i) . "&nbsp;&nbsp;";
}
echo "<hr>";

echo "斐波那契数列 - 过程(竖排):" . "<br>";
for($i = 1 ; $i <= 6 ; $i++){
    echo $fbnq->fbnq($i) . "<br>";
}
echo "<hr>";

echo "斐波那契数列 - 过程(每五个一排):" . "<br>";
for($i = 1 ; $i <= 10 ; $i++){
    echo $fbnq->fbnq($i) . "&nbsp;&nbsp;";
    if($i % 5 == 0){
        echo "<br>";
    }
}
echo "<hr>";

echo "斐波那契数列 - 过程(数组):" . $fbnq->array_fbnq(6);