【php】神奇的斐波那锲数列(递归 + 非递归)实现

六眼飞鱼酱① 提交于 2019-12-31 13:18:14

一、小知识(概念 + 趣味故事)

1、斐波那契数列:

1 1 2 3 5 8 13 21 34 55 …

概念:

前两个值都为1,该数列从第三位开始,每一位都是当前位前两位的和

规律公式为:

Fn = F(n-1) + F(n+1)

F:指当前这个数列

n:指数列的下标

2、永生的兔子

斐波纳契早年思考一个关于兔子繁殖的数学问题:从一只雄兔和一只雌兔开始,一年能生多少对兔子?该问题假设了以下条件:从一只刚出生的公兔和母兔开始。兔子在一个月后达到性成熟。兔子的妊娠期是一个月。雌性兔子性成熟后,每月生育一次。一只母兔子生了一只公兔子和一只母兔子。兔子不会死。如下图所示:

 

二、源代码(递归 + 非递归)实现

<?php
    function test() {
        $x = 39; //自增量 可变
        $star_time = time();
        //斐波那锲数列 递归调用
        $arr = [];
        for ($i=1; $i<=$x; $i++) {
            $arr[] = f_digui($i);
        }

        //非递归方式生成
        $arr2 = fbnq($x);

        $end_time = time();
        echo "<pre>"; print_r($arr);
        echo "<pre>"; print_r($arr2);
        echo "<pre>"; print_r($star_time - $end_time);exit;
    }

    //非递归写法:
    function fbnq($n){  //传入数列中数字的个数
        if($n <= 0){
            return 0;
        }
        $array[1] = $array[2] = 1; //设第一个值和第二个值为1
        for($i=3;$i<=$n;$i++){ //从第三个值开始
            $array[$i] = $array[$i-1] + $array[$i-2];
            //后面的值都是当前值的前一个值加上前两个值的和
        }
        return $array;
    }
    
    //递归写法:
    public function f_digui($n){
        if($n == 1 || $n == 2) return 1;
        return f_digui($n - 1) + f_digui($n - 2);
    }

二、结果演示 :由于php和python是单进程的,跑的过程中发现以下两个神奇的事情:

1、当自变量达到40的时候程序会异常, 跑不动,这个时候数据刚过亿, 是不是就是传说中的奇点

2、数值越大, 前后的两个数字之比越接近0.618

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!