PHP: Fibonacci Sequence

Posted by – January 6, 2012

Finbonacci Sequence (費氏數列、費伯納數列) 對於寫程式的人來說應該不陌生。數學上的費氏數列是以遞迴方式定義的,如下

F0 = 0, F1 = 1 時,Fn = Fn-1 + Fn-2

用文字來說,就是費氏數列由 0 和 1 開始,之後的費氏數列就由之前的兩數相加。前幾個數字是

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377.....

用遞迴方式的標準寫法是...

<?php
function fib($n){
    if($n == 0) return 0;
    if($n == 1) return 1;
    return fib($n-1) + fib($n-2); // 只有return,沒有echo
}

for($i = 0; $i <= 10; $i++){
    echo fib($i).' '; // 實際上輸出數列
}
?>

0 1 1 2 3 5 8 13 21 34 55

但是用這種方法才能看到數列也太瞎了,所以想改成計算過程中就輸出數列的版本,想不到這問題還真的要思考一下.... 最後的成果如下....

<?php
function fib($n, $output = true){
    if($n == 0){
        if($output) echo '0 ';
        return 0;
    }
    if($n == 1){
        if($output){
            fib(0, true);
            echo '1 ';
        }
        return 1;
    }
    $a = fib($n-1, $output);
    $b = fib($n-2, false);
    $sum = $a + $b;
    if($output) echo $sum.' ';
    return $sum;
}

fib(10);
?>
0 1 1 2 3 5 8 13 21 34 55

同樣的題目用 for loop 寫倒是蠻簡單的

<?php
function fib_in_loop($x){
    $sum = 0;
    $a = 0;
    $b = 1;
    for($i = 0; $i < $x; $i++){
        printf('%d ', $b);
        $sum = $a + $b;
        $a = $b;
        $b = $sum;
    }
    return $sum;
}

fib_in_loop(10);
?>
0 1 1 2 3 5 8 13 21 34 55

References:

Leave a Reply

Your email address will not be published. Required fields are marked *