找到第一个有1000位数的斐波纳契数

时间:2015-08-06 13:15:08

标签: php ini

这是我编码解决我的问题,它可以快速生成第10位数字,我已经 php.ini max-execution-time 更改为 10000 它在一小时内没有得到答案。如何快速/快速地运行此代码。

function fabNumber($n){
    if($n==1 || $n==2) {
        return 1;
    }
    return fabNumber($n-2) + fabNumber($n-1);
}

function count_digit($number){
    return strlen($number);
}


$i = 1;
$count = 1;
while( $count != 1000){

    $fab_number = fabNumber($i);
    $count =  count_digit($fab_number);
    //var_dump($fab_number ,$count)."<br>";
    ++$i;
    echo $fab_number . "  index of ". $i ."<br>" ;
} 

我应该使用GMP库

Edit 1:


  function fabNumber($n){
    if($n==1 || $n==2) {
        return 1;
    }
    return gmp_strval( fabNumber($n-2) )+ gmp_strval(fabNumber($n-1) );
}

function count_digit($number){
    return strlen($number);
}


$i = 1;
$count = 1;
while( $count != 100){

    $fab_number =gmp_strval( fabNumber($i));
    $count =  count_digit($fab_number);
    //var_dump($fab_number ,$count)."<br>";
    ++$i;
    echo gmp_strval($fab_number) . "  index of ". $i ."<br>" ;
}

@same进展缓慢

2 个答案:

答案 0 :(得分:1)

类似的东西:

/\A[- +()0-9]+\z/       # correct and clean
/\A[- +()\d]+\z/        # correct and possibly shortest :)

(PHP&gt; = 5.5.0)

答案 1 :(得分:1)

您可以缓存数字以节省时间,因为在您的版本中,您会在每次迭代时重新计算所有数字

$GLOBALS["fabTab"] = array();


function fabNumber($n){
    if($n==1 || $n==2) {
        return "1";
    }

    if (!isset($GLOBALS["fabTab"][$n])) {
        $GLOBALS["fabTab"][$n] = bcadd(fabNumber($n-2), fabNumber($n-1));
    }

    return $GLOBALS["fabTab"][$n];
}

function count_digit($number){
    return strlen($number);
}

$start = time();

$i = 1;
$count = 1;
while( $count != 1000) {
    $fab_number = fabNumber($i);
    $count =  count_digit($fab_number);
    //var_dump($fab_number ,$count)."<br>";
    ++$i;
} 

echo "$fab_number<br/>index of ". $i ."<br>" ;
echo $count . " digits<br>" ;
echo (time() - $start) . " seconds<br>" ;