如何解决 PHP For loop IN 内存问题
Posted
技术标签:
【中文标题】如何解决 PHP For loop IN 内存问题【英文标题】:How to solve PHP For loop INF memory problem 【发布时间】:2021-08-22 22:06:57 【问题描述】:这段代码的问题是,在执行for循环时,内存使用量不断增加。例如,当我使用较小的 $seq_limit
1000 运行代码时,它会完美执行。但是当代码以 1500 的 $seq_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();
?>
【问题讨论】:
【参考方案1】:即使您以不耗尽内存的方式实现此功能,第 1500 个斐波那契数也是 1.355E313
。那是一个有 314 位数字的数字。最大可表示的双精度浮点数大致为1.8E308
。如果你想超越这个范围,你将需要使用像 BCmath 这样的特殊库来处理这么大的数字。不会很快。
也就是说,要生成斐波那契数列,您唯一需要知道的是最后两个数字是什么。你的记忆在不断增加,因为你在不断地增加它。
或者,使用简单的生成器函数:
function fib_gen()
yield 1;
yield 1;
$state = [1,1];
$offset=2;
while(true)
$v = array_sum($state);
yield $v;
$state[$offset % 2] = $v;
++$offset;
$c = 1;
$sum = 0;
$sum_even = 0;
$start = microtime(true);
foreach(fib_gen() as $f)
// printf("%4d: %d\n", $c, $f);
$sum += $f;
if( $c % 2 == 0 ) $sum_even += $f;
if( $c++ >= 1000 ) break;
$end = microtime(true);
printf(" sum: %s\nsum_even: %s\nduration: %f ms\npeak mem: %d kB\n",
$sum, $sum_even, ($end-$start)*1000, memory_get_peak_usage() / 1024
);
输出:
sum: 1.1379692539836E+209
sum_even: 7.0330367711423E+208
duration: 1.071930 ms
peak mem: 416 kB
【讨论】:
以上是关于如何解决 PHP For loop IN 内存问题的主要内容,如果未能解决你的问题,请参考以下文章
解决Dev-C++ [Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode