2016-11-16 5 views
0

숫자가 피보나치 시퀀스에 속하는지 확인하는 효율적인 방법이 있습니까?JS : 숫자가 피보나치 시퀀스 (루프 없음)에 속하는지 확인

배열에 시퀀스를 생성하고 새로 생성 된 시퀀스 번호가 입력 번호와 동일한 지 확인할 때마다 루프를 사용하여 많은 예제를 보았습니다. 다른 방법이 있습니까?

+0

상한선을 지수 검색 한 다음 'f0'을 하한선으로 사용하고 유효한 fibonacci 번호를 이진 검색 할 수 있습니다. 더 빨리 가능하면 확신 할 수 없으며, 수학자에게 물어보십시오. – ASDFGerte

답변

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 번째 피보나치 숫자 이상에서는 숫자가 너무 커서 문제를 볼 수 있습니다.

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; 

이것은 저의 파이썬 구현입니다. 하지만 수식은 수족관이 너무 크지 않을 때만 작동합니다. 피보나치 번호에 대한 특별한 품질이 숫자가 피보나치임을 의미가 있다고

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)); 
} 

큰 숫자 일수록 실패 할 가능성이 높습니다.