/**
* ref:https://leetcode-cn.com/problems/fibonacci-number/
* 斐波那契数,通常用F(n)表示,形成的序列称为斐波那契数列。
* 该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:
* F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2),其中n>1,给你n,请计算F(n)。
* 输入:10
* 输出:55
* 解释:F(10)=F(9)+F(8)+...+F(1)+F(0)=55
*/
public class FibonacciNumber {
public static void main(String[] args){
System.out.println(forceRecursion(10))
System.out.println(memoryRecursion(10))
System.out.println(iterate(10))
}
/**
* 暴力递归方法
* 当num=0,则输出0。当num=1,则输出1。其他值通过递归计算得出
* @param num
* @return
*/
public static int forceRecursion(int num) {
if(num==0) {
return 0
}
if(num==1) {
return 1
}
return forceRecursion(num-1)+forceRecursion(num-2)
}
/**
* 记忆递归方法
* 当num=0,则输出0。当num=1,则输出1。
* 其他值在计算之前,先进行一次查询(通过下标在暂存数组中查找值是否为0,不是0则表示之前已经计算过),
* 如果查询不到,则通过递归计算,并将结果暂存到数组中。
* @param num
* @return
*/
public static int memoryRecursion(int num) {
// 暂存之前的计算结果,数据是从0~num,因此数组长度是num+1
int[] memoryData = new int[num+1]
if(num==0) {
return 0
}
if(num==1) {
return 1
}
if(memoryData[num]!=0) {return memoryData[num]
return memoryData[num] = memoryRecursion(num-1)+memoryRecursion(num-2)
}
/**
* 迭代方进行计算,由于计算F(N)=F(N-1)+F(N-2)。
* 因此可以通过迭代然来记录迭代索引之前的两个值计算的结果,然后直接累加就是所求的值。
* 定义两个变量,分别用来保存要计算下标值的前一个元素first,和前前一个元素second。
* 每迭代一次,sum=first+second
* @param num
* @return
*/
public static int iterate(int num) {
if(num==0) {
return 0
}
if(num==1) {
return 1
}
int first = 1
int second = 0
int sum = 0
for(int i=2
sum = first + second
second = first
first = sum
}
return sum
}
}