사실 처음 두 개의 피보나치 수는 미리 정의되어 있습니다. 첫 번째 피보나치 수는 0이고 두 번째 피보나치 수는 1입니다. 0부터 시작하는 인덱싱을 사용하고 피보나치 수가 배열에 있다고 가정하면 다음과 같습니다.
인덱스에서 0 , 피보나치 수는 0 , ( 미리 정의된 ) ;인덱스에서 1 , 피보나치 수는 1 , ( 미리 정의된 ) ;
인덱스에서 둘 , 피보나치 수는 1 = 1 + 0 , ( 정의에 의해 ) ;
인덱스에서 삼 , 피보나치 수는 둘 = 1 + 1 , ( 정의에 의해 ) ;
인덱스에서 4 , 피보나치 수는 삼 = 둘 + 1 , ( 정의에 의해 ) ;
인덱스에서 5 , 피보나치 수는 5 = 삼 + 둘 , ( 정의에 의해 ) ;
인덱스에서 6 , 피보나치 수는 8 = 5 + 삼 , ( 정의에 의해 ) ;
인덱스에서 7 , 피보나치 수는 13 = 8 + 5 , ( 정의에 의해 ) ;
인덱스에서 8 , 피보나치 수는 이십 일 = 13 + 8 , ( 정의에 의해 ) ;
인덱스에서 9 , 피보나치 수는 3. 4 = 이십 일 + 13 , ( 정의에 의해 ) ;
등등.
프로그래밍에서 i가 아닌 변수 n은 이러한 피보나치 수에 대한 0부터 시작하는 인덱스에 사용됩니다. 그리고 처음 12개의 피보나치 수는 다음과 같습니다.
0 | 1 | 1 | 둘 | 삼 | 5 | 8 | 13 | 이십 일 | 3. 4 | 55 | 89 |
0 | 1 | 둘 | 삼 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 열하나 |
테이블의 두 번째 행은 0부터 시작하는 인덱스를 제공하며 각 인덱스는 프로그래밍에서 변수 n을 갖습니다. 첫 번째 행은 해당하는 피보나치 수를 제공합니다. 따라서 피보나치 수는 단순한 숫자가 아닙니다. 핵심 정의는 첫 번째 피보나치 수에 대해 0으로 시작하고 두 번째 피보나치 수에 대해 1로 시작합니다. 나머지 숫자는 거기에서 생성됩니다.
피보나치 수는 O(n) 시간과 O(1) 시간에 생성될 수 있습니다. O(n) 시간의 경우 예를 들어 n이 12이면 처음 12개의 피보나치 수가 생성됩니다. O(1) 시간 동안 하나의 피보나치 수만 생성됩니다. 예를 들어, n이 6이면 피보나치 수 8이 생성됩니다.
이 기사에서는 Java에서 피보나치 수를 생성하는 두 가지 방법에 대해 설명합니다.
피보나치 수 공식
피보나치 수에는 수학 공식이 있습니다. 이 공식은 세 줄 또는 한 줄로 작성할 수 있습니다. 세 줄로 다음과 같이 작성됩니다.
여기서 F N 는 0부터 시작하는 n에서의 피보나치 수입니다. 일 인덱스. 피보나치 수는 이렇게 정의됩니다.
O(n) 시간에 피보나치 수 생성하기
피보나치 수를 O(3)번으로 생성하면 0, 1, 1이 생성됩니다. 그것들은 처음 세 개의 피보나치 수입니다. 마지막 0부터 시작하는 n 일 여기서 인덱스는 2입니다. 피보나치 수를 O(7)번으로 생성하면 0, 1, 1, 2, 3, 5, 8이 생성됩니다. 그것들은 처음 7개의 피보나치 수입니다. 마지막 0부터 시작하는 n 일 여기서 인덱스는 6입니다. 피보나치 수를 O(n)번 생성하려면 0, 1, 1, 2, 3, 5, 8 - - -가 생성됩니다. 그것들은 처음 n개의 피보나치 수입니다. 마지막 0부터 시작하는 n 일 여기서 인덱스는 n-1입니다.
처음 n개의 피보나치 수를 생성하는 클래스의 Java 메서드는 다음과 같습니다.
수업 피보나치 {무효의 피보나치 ( 정수 [ ] 피 ) {
정수 N = 피. 길이 ;
만약에 ( N > 0 )
피 [ 0 ] = 0 ;
만약에 ( N > 1 )
피 [ 1 ] = 1 ;
~을 위한 ( 정수 나 = 둘 ; 나 < N ; 나 ++ ) { //n=0 및 n=2가 고려되었습니다.
정수 커No = 피 [ 나 - 1 ] + 피 [ 나 - 둘 ] ;
피 [ 나 ] = 커No ;
}
}
}
피보나치 클래스는 비공개입니다. 그만큼 피보나치() 메소드는 배열 P를 취하고 void를 리턴합니다. 이 방법은 배열의 길이를 결정하는 것으로 시작됩니다. 이 길이 n은 필요한 피보나치 수입니다. 첫 번째 및 두 번째 피보나치 수는 명시적으로 결정되어 배열의 첫 번째 및 두 번째 위치에 배치됩니다.
세 번째(인덱스, n = 2)부터 시작하는 나머지 피보나치 수는 for 루프에서 결정되고 배열의 해당 위치에 배치됩니다. 따라서 함수는 void를 반환해야 합니다. for 루프의 주요 문은 이전 두 숫자를 더합니다.
명확성을 위해 인덱스 변수 i가 n 대신 사용되었습니다.
적절한 Java Main 클래스(Java 기본 메서드 포함)는 다음과 같습니다.
공공의 수업 기본 {공공의 공전 무효의 기본 ( 끈 인수 [ ] ) {
정수 중 = 12 ;
정수 [ ] 아 = 새로운 정수 [ 중 ] ;
피보나치 오브제 = 새로운 피보나치 ( ) ;
사물 피보나치 ( 아 ) ;
~을 위한 ( 정수 나 = 0 ; 나 < 중 ; 나 ++ )
체계 . 밖으로 . 인쇄 ( 아 [ 나 ] + ' ' ) ;
체계 . 밖으로 . 인쇄 ( ) ;
}
}
fibonacci() 메소드에 의해 숫자가 생성된 후 Java 기본 메소드가 숫자를 읽습니다.
일정한 시간에 하나의 피보나치 수 생성하기
해당하는 0부터 시작하는 인덱스 n이 주어지면 피보나치 수를 생성하는 데 사용할 수 있는 수학 공식이 있습니다. 공식은 다음과 같습니다.
여기서 n은 0부터 시작하는 인덱스이고 Fib는 N 해당하는 피보나치 수입니다. 방정식의 오른쪽에서 n의 거듭제곱은 5의 제곱근이 아닙니다. n의 거듭제곱은 괄호 안의 표현식입니다. 그런 표현이 두 가지 있습니다.
n이 0이면 Fib N 0입니다. n이 1이면 Fib N n이 2이면 Fib N 1이 됩니다. n이 3이면 Fib N 2가 됩니다. n이 4이면 Fib N 3 등일 것입니다. 독자는 n에 다른 값을 대입하고 평가하여 이 공식을 수학적으로 확인할 수 있습니다.
코딩할 때 이 공식은 n에 대해 단 하나의 피보나치 수를 생성합니다. 둘 이상의 피보나치 수가 필요한 경우 수식의 코드는 서로 다른 해당 인덱스 각각에 대해 한 번씩 호출되어야 합니다.
Java에서 피보나치 수를 하나만 생성하는 방법은 다음과 같습니다.
수입 java.lang.* ;수업 악의 없는 거짓말 {
더블 fibNo ( 정수 N ) {
더블 섬유질 = ( 수학 . 펑 ( ( 1 + 수학 . 평방 미터 ( 5 ) ) / 둘 , N ) – 수학 . 펑 ( ( 1 - 수학 . 평방 미터 ( 5 ) ) / 둘 , N ) ) / 수학 . 평방 미터 ( 5 ) ;
반품 섬유질 ;
}
}
java.lang.* 패키지는 프로그램 시작 시 가져와야 했습니다. 이는 패키지에 거듭제곱(pow) 및 제곱근(sqrt) 메서드가 있는 Math 클래스가 있기 때문입니다. 여기서 사용자 정의 Java 메소드는 수학 공식을 직접 구현합니다.
이 함수의 시간 복잡도는 O(1)이며, 하나의 주요 작업에 대해 일정하게 길들여집니다. 위의 방법에 대한 Java 기본 방법이 있는 적절한 Java 기본 클래스는 다음과 같습니다.
공공의 수업 기본 {공공의 공전 무효의 기본 ( 끈 인수 [ ] ) {
정수 N = 열하나 ;
피브 오브제 = 새로운 악의 없는 거짓말 ( ) ;
더블 오른쪽 = 오브제. fibNo ( N ) ;
체계 . 밖으로 . 인쇄 ( 오른쪽 ) ;
}
}
인덱스 n = 11이 전송되고 피보나치 수인 89가 반환됩니다. 출력은 다음과 같습니다.
89.00000000000003불필요한 십진수는 제거할 수 있지만 이는 다른 시간에 대한 논의입니다.
결론
피보나치 수는 정수의 특정 시퀀스입니다. 현재 번호를 얻으려면 바로 이전에 해당하는 두 번호를 더하십시오. 전체 수열에 대해 처음 두 개의 피보나치 수(0 다음에 1)가 미리 선언됩니다. 나머지 피보나치 수는 거기에서 생성됩니다.
인덱스 2에서 인덱스 n-1에 해당하는 피보나치 수를 생성하려면 주요 문과 함께 for 루프를 사용합니다.
정수 커No = 피 [ 나 - 1 ] + 피 [ 나 - 둘 ] ;여기서 currNo는 현재 피보나치 수이고 P는 n개의 숫자를 저장할 배열입니다.
0부터 시작하는 인덱스 n에서 단 하나의 피보나치 수를 생성하려면 수학 공식을 사용하십시오.