JS:检查数字是否属于Fibonacci序列(无循环)

时间:2016-11-16 18:23:52

标签: javascript fibonacci

是否有一种有效的方法来检查数字是否属于Fibonacci序列?

我见过很多带循环的例子,它在数组中创建序列,并且每次检查新生成的序列号是否等于输入数。还有另一种方式吗?

3 个答案:

答案 0 :(得分:4)

http://www.geeksforgeeks.org/check-number-fibonacci-number/

此链接详细说明有关斐波那契数字的特殊质量,这意味着当且仅当(5 * n2 + 4)或(5 * n2 - 4)中的一个或两个是完美正方形时,数字才是斐波纳契数。

所以,

function (num) {
    if (isSquare(5*(num*num)-4) || isSquare(5*(num*num)+4) {
       return true;
    } else { return false; }
}

然后isSquare只是一个简单的检查功能。

编辑:值得注意的是,虽然这是一种更有效,更容易找到斐波那契数字的方法,但确实有一个上限。大约在第70个斐波那契数字及以上,您可能会看到问题,因为数字太大。

答案 1 :(得分:0)

def is_squared(number):
   temp_root = math.sqrt(number);
   temp_root = int(temp_root);
   return (temp_root * temp_root == number);

def check_all_fibo(test_number_list):
    result_fibo_list = [];
    for item in test_number_list:
        if item==0 or item == 1 or item == 2:
            result_fibo_list.append(item);
            continue;
        if is_squared(5 * item * item - 4) or is_squared(5 * item * item + 4):
            result_fibo_list.append(item);
    return result_fibo_list;

这是我的python实现。但请记住,该公式仅在纤维不太大时才有效。

答案 2 :(得分:0)

function isSquare(n) {
    return n > 0 && Math.sqrt(n) % 1 === 0;
};

//Equation modified from http://www.geeksforgeeks.org/check-number-fibonacci-number/
function isFibonacci(numberToCheck)
{
    // numberToCheck is Fibinacci if one of 5*n*n + 4 or 5*n*n - 4 or both
    // is a perferct square
    return isPerfectSquare(5*numberToCheck*numberToCheck + 4) ||
           isPerfectSquare(5*numberToCheck*numberToCheck - 4);
}


for(var i = 0; i<= 10000; ++i) {
    console.log(i + " - " + isFibonacci(i));
}

尽管如此,这很可能会失败。