JS:检查数字是否属于斐波那契数列(无循环)



有没有一种有效的方法来检查数字是否属于斐波那契数列?

我见过很多循环的例子,该循环在数组中创建序列,并在每次检查新生成的序列数是否等于输入数。还有别的办法吗?

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 个斐波那契数及以上,您可能会看到问题,因为数字太大。

function isFibonacci(num, a = 0, b = 1) {
  if(num === 0 || num === 1) {
    return true;
  }
  let nextNumber = a+b;
  if(nextNumber === num) {
    return true;
  }
  else if(nextNumber > num) {
    return false;
  }
 return isFibonacci(num, b, nextNumber);
}
function isPerfectSquare(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));
}

不过,对于更大的数字,这很可能会失败。

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实现。但请记住,该公式仅在斐波那契不太大时才有效。

斐波那契数列是一系列数字,其中数字是最后两个数字的相加,从 0 和 1 开始。下面的js函数正在解释这一点。

    function isFabonacci(n) {
        if (n === 1 || n === 0) {
            return true;
        }
        let firstPrevNumber = n - 1;
        let secondPrevNumber = n - 2;
        return (firstPrevNumber + secondPrevNumber === n);
    }
    // isFabonacci(2) -> false
    // isFabonacci(3) -> true

相关内容

  • 没有找到相关文章