斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:
F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)
记住这句话:
从第2项开始,每一项都等于前两项之和。(第0项是0,第一项是1)
下面用两种方式实现
1、递归
比如说想求解f(10),需要先求得f(9)和f(8),同理,想求得f(9),需要先求得f(8)和f(7)……
这是从上往下计算,会发现很多结点是重复的,随着n的增大,重复的结点数会急剧增加。时间复杂度很大
2、递推 (效率更高)
从下往上计算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)……这种思路时间复杂度是O(n)
package offer_9; import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Please input this fibonacci n:"); int n = scanner.nextInt(); // 假设输入为大于零的整数 // System.out.println(fibonacci(6) + ":" + fibonacciNormal(6)); int sum = 0; for(int i = 1; i <= n; i++){ sum += fibonacci(i); } System.out.println(sum); } // 递归实现方式 public static int fibonacci(int n){ if(n <= 2){ return 1; }else{ return fibonacci(n-1) + fibonacci(n-2); } } // 递推实现方式 public static int fibonacciNormal(int n){ if(n <= 2){ return 1; } int n1 = 1, n2 = 1, sn = 0; for(int i = 0; i < n - 2; i ++){ sn = n1 + n2; n1 = n2; n2 = sn; } return sn; } }
比如:递归方式调用fibonacci(int n)
n=0时:不执行for循环,直接输出0
n=1时:for循环就执行一次,sum=0+fibonacci(1)=0+1=1
n=2时:for循环执行两次,最后sum=2
n=3时:for(int i = 1; i <= 3; i++)执行三次,最后sum=4
……