我需要找到一个给定整数N的(下一个)斐波纳契数。所以假设我有n = 13并且我需要输出下一个斐波纳契数21,但我该怎么做?如何找到以前编号形成的数字?
我的意思是我可以很容易地想出一个返回斐波那契序列的for / while循环,但是如何通过给出前一个数字来找到下一个数字。
<?php
$n = 13;
while($n < 1000) {
$n = $x + $y;
echo($n."<br />");
$x = $y;
$y = $n;
}
?>
答案 0 :(得分:4)
您可以使用Binet's Formula:
n -n
F(n) = phi - (-phi)
---------------
sqrt(5)
其中phi是黄金比例(( 1 + sqrt(5) ) / 2) ~= 1.61803...
这使您可以确切地确定序列的第n个项。
答案 1 :(得分: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);
请注意,我没有对此进行测试,并且代码可以进行优化,因此在进行downvoting之前,请考虑这仅仅是问题的概念。
答案 2 :(得分:0)
您可以一步完成此操作:
phi = (1+sqrt(5))/2
next = round(current*phi)
(round
是一个返回最接近整数的函数;基本上等同于floor(x+0.5)
)
例如,如果您当前的电话号码是13
:13 * phi = 21.034441853748632
,则四舍五入到21
。