1.什么是算法?
- 算法是解决特定问题的一系列的执行步骤。
注意: 使用不同的算法,效率可能相差非常大。
比如求第n个斐波那契数(Fibonacci number)
2.什么是斐波那契数?
指的是这样一个数列:0、1、1、2、3、5、8、13、21、34……在数学上,斐波那契数列以如下被以递推的方法定义:
F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)
(就是前两个数相加等于第三个数)
- 递归法代码如下:(待会有更好的解决方案)
public class Fibonacci {
/**
* 斐波那契数0 1 1 2 3 5 8 13...
*/
public static int fib(int n) {
//如果n是0或者1就输出他自己,前两个数是0和1
if (n <= 1) return n;
//否则就输出前两个数的和
return fib(n - 1) + fib(n - 2);
}
public static void main(String[] args) {
System.out.println(fib(0));
System.out.println(fib(1));
System.out.println(fib(2));
System.out.println(fib(3));
System.out.println(fib(4));
//结果输出0 1 1 2 3
}
}
弊端:如果输入60以上结果会迟迟不出来。
- 解决思路:0 1 1 2 3 5
- 第一步
如果n<=1:前两项就等于自己本身,所以先定义first=0;second=1; - 第二步
如果n=2:需要前两个数加1次赋值给第三个数(从n=0开始)
如果n=3:需要加2次
如果n=4:需要加3次
所以使用for循环,循环次数为n-1次 - 第三步
前两个数的和(sum)要给下一个second
比如1+2=3:1是first,2是second,3是和sum(下一个second)
下一次2+3=5:2是first,3是second
最后上一个second是下一次循环的first ://first=second;
迭代法:
public static int f1(int n) {
if (n <= 1) {
return n;
}
//前两项就等于自己本身,所以先定义first=0;second=1;
int first = 0;
int second = 1;
//循环次数为n-1次
for (int i = 0; i < n - 1; i++) {
//前两个数相加赋值给第三个数
int sum = first + second;
//上一次相加的第二个数是下一次相加的第一个数
first = second;
//上一次的和是下一次相加的第二个数
second = sum;
}
return second;
}
优势:秒算。
当然还有矩阵乘法优化等方法以后进阶系列讲
因为针对的是小白入门级别的,所以我讲的比较细,以后的系列一边看一边想肯定很容易想通的,加油!奥里给!
下一章讲**时间复杂度和空间复杂度**