JS:checking 如果数字属于斐波那契数列(无循环)
JS:checking if number belongs to Fibonacci sequence(without loop)
有没有一种有效的方法来检查数字是否属于斐波那契数列?
我见过很多例子,其中有一个循环在数组中创建序列,并每次检查新生成的序列数是否等于输入数。还有别的办法吗?
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 实现。但请记住,该公式仅在斐波那契不太大时有效。
http://www.geeksforgeeks.org/check-number-fibonacci-number/
这个 link 详细说明了斐波那契数的特殊性质,这意味着一个数是斐波那契当且仅当 (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 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));
}
不过,对于较大的数字,这很可能会失败。
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);
}
斐波那契数列是一系列数字,其中一个数字是最后两个数字的相加,从 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
有没有一种有效的方法来检查数字是否属于斐波那契数列?
我见过很多例子,其中有一个循环在数组中创建序列,并每次检查新生成的序列数是否等于输入数。还有别的办法吗?
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 实现。但请记住,该公式仅在斐波那契不太大时有效。
http://www.geeksforgeeks.org/check-number-fibonacci-number/
这个 link 详细说明了斐波那契数的特殊性质,这意味着一个数是斐波那契当且仅当 (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 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));
}
不过,对于较大的数字,这很可能会失败。
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);
}
斐波那契数列是一系列数字,其中一个数字是最后两个数字的相加,从 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