【问题标题】:Finding next fibonacci number寻找下一个斐波那契数
【发布时间】:2014-08-07 17:01:37
【问题描述】:

我需要在给定整数 N 的情况下找到一个(下一个)斐波那契数。假设我有 n = 13,我需要输出下一个斐波那契数,即 21,但我该怎么做呢?我怎样才能找到以前的数字相加形成它?

我的意思是我可以很容易地想出一个返回斐波那契数列的 for/while 循环,但是如何通过给出前一个数字来找到下一个数字。

<?php

$n = 13;

while($n < 1000) {

    $n = $x + $y; 
    echo($n."<br />"); 
    $x = $y;
    $y = $n;
}
?>

【问题讨论】:

  • 为什么不直接创建一个循环,继续进行一次迭代而不是获得输入的总和?这可能不是最有效的方法,但它是一种方法。
  • 这可能是关于您给定的术语中的两个数字的比率吗?数字的比率趋向于 1.618。那么计算这两个整数必须是什么是相当容易的吗?将给定项除以 1.618 以了解其中一个数字?

标签: php fibonacci


【解决方案1】:

只需 1 步即可完成:

phi = (1+sqrt(5))/2

next = round(current*phi)

(其中round是一个返回最接近整数的函数;基本等价于floor(x+0.5)

例如,如果您当前的号码是1313 * phi = 21.034441853748632,则四舍五入为21

【讨论】:

  • 这在 N 已经是斐波那契数的情况下有效,但不适用于例如N=4。
【解决方案2】:

使用循环,您可以将值存储在一个数组中,该数组可以在在前一个键值中找到所选数字后立即停止一个键。

function getFib($n) {

   $fib = array($n+1);       // array to num + 1
   $fib[0] = 0; $fib[1] = 1; // set initial array keys
   $i;

   for ($i=2;$i<=$n+1;$i++) {
      $fib[$i] = $fib[$i-1]+$fib[$i-2];
        if ($fib[$i] > $n) { // check if key > num 
            return $fib[$i];
            }
        }
    if ($fib[$i-1] < $n) {   // check if key < num
        return $fib[$i-1] + $n;
    }
    if ($fib[$i] = $n-1) {   // check if key = num
        return $fib[$i-1] + $fib[$i-2];
    } 
    if ($fib[$i-1] = 1) {    // check if num = 1
        return $n + $n;
    }
}

$num = 13;
echo "next fibonacci number = " . getFib($num);

请注意,我尚未对此进行测试,并且可以优化代码,因此在投票之前,请考虑这仅作为所提问题的概念。

【讨论】:

  • 这非常干净。谢谢你的时间:)
  • 不客气,很高兴它有帮助。如果您想更进一步,您可以让它识别$num 是否也是斐波那契数。这是一个工作示例:ideone.com/vr5bJH
  • 是的,我后来写了类似的东西。无论如何,我还有一个简短的问题。如何获得序列的前 N ​​个成员?到目前为止,我只想到了这个:pastebin.com/qHvjUzdC 但是这样我只输出从 3 开始的数字,而且我还需要从斐波那契数列开始的 0、1、1 和 2。
【解决方案3】:

你可以使用Binet's Formula:

          n          -n
F(n) = phi   - (-phi)
       ---------------
          sqrt(5)

其中 phi 是黄金分割率(( 1 + sqrt(5) ) / 2) ~= 1.61803...

这使您可以准确地确定序列的第 n 项。

【讨论】:

  • 我怎么可能在 PHP 中实现它?
  • 但这无助于找到最接近给定数字的斐波那契数
  • @hindmost 您可以使用公式找到n 对应F(n) = 13,然后再次使用它来计算n-1。
  • @hindmost:当然可以。开始填写n 值并使用二进制类型搜索来缩小可能的值。即使是一个简单的循环也是可行的$i = 0; while(F($i) &lt;= $search_value) { $i++; }
  • @MikeFonder:这只是数学。 php 完全可以通过pow() 进行求幂运算,在v5.6+ 中,它甚至还有** 运算符。
猜你喜欢
  • 2016-11-28
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2015-06-05
  • 2014-05-23
  • 2014-05-03
相关资源
最近更新 更多