如何解决PHP For循环INF内存问题

如何解决PHP For循环INF内存问题,php,for-loop,memory,methods,Php,For Loop,Memory,Methods,这段代码的问题是,当for循环执行时,内存使用量不断增加。例如,当我使用较小的$seq_limit1000运行代码时,它会完美地执行。但是,当代码以1500的$seq\u limit值运行时,它返回INF。我该如何解决这个问题?下面是我的代码 <?php class fibonacci { private $seq_limit; private $sequence = array(1,2); private $even_values = array();

这段代码的问题是,当for循环执行时,内存使用量不断增加。例如,当我使用较小的
$seq_limit
1000运行代码时,它会完美地执行。但是,当代码以1500的
$seq\u limit
值运行时,它返回INF。我该如何解决这个问题?下面是我的代码

<?php

class fibonacci {

    private $seq_limit;
    private $sequence = array(1,2);
    private $even_values = array();
    private $sum_even;

    public function __construct(int $seq_limit){
    $this->seq_limit = $seq_limit;
    }
   
    public function fibonacci_sequence(){
       for ($i=0; $i<=$this->seq_limit-3; $i++) { 
        $this->sequence[] = $this->sequence[$i] + $this->sequence[$i+1];
       } 
       return $this->sequence;
    }

    public function even_values(){
        foreach ($this->fibonacci_sequence() as $value) {
            if ($value % 2 == 0) {
                $this->even_values[] = $value;
            }
        }
        return $this->even_values;
    }

    public function sum_even(){
        foreach ($this->even_values() as $value) {
            $this->sum_even += $value;
        }
        return $this->sum_even;
    }

 }


 $fibonacci = new fibonacci(1500);
 echo $fibonacci->sum_even();

 ?>

即使以不耗尽内存的方式实现,第1500个斐波那契数也是
1.355E313
。这是一个314位的数字。可表示的最大双精度浮点数约为
1.8E308
。如果你想超越这些,你需要使用一个特殊的库,比如BCmath来处理这么大的数字。不会很快

也就是说,要生成斐波那契序列,唯一需要知道的是最后两个数字是什么。你的记忆力在不断增长,因为你在不断增加

或者,使用简单的生成器函数:

函数fib_gen(){ 产量1; 产量1; $state=[1,1]; $offset=2; while(true){ $v=数组和($state); 收益率$v; $state[$offset%2]=$v; ++$offset; } } $c=1; $sum=0; $sum_偶数=0; $start=microtime(真); foreach(fib_gen()作为$f){ //printf(“%4d:%d\n”,$c,$f); $sum+=$f; 如果($c%2==0){$sum_偶数+=$f;} 如果($c++>=1000){break;} } $end=微时间(真); printf(“总和:%s\n单位偶数:%s\n长度:%f毫秒\n峰值内存:%d kB\n”, $sum,$sum_偶数,($end-$start)*1000,内存获取峰值使用率()/1024 ); 输出:

     sum: 1.1379692539836E+209
sum_even: 7.0330367711423E+208
duration: 1.071930 ms
peak mem: 416 kB