问题:斐波那契数列(Fobonacci):1,1,2,3,5,8,13,... ;给定下标n,根据下标n求下标n所对应的值
实现方式如下5种:
1、递归实现
2、while循环实现
3、循环数组实现
4、for循环实现
5、尾递归实现(比递归实现性能好)
/**
* 1,1,2,3,5,8,13... 斐波那契数列(Fobonacci)
*/
public class Fobonacci {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(f1(40));
System.out.println(f2(40));
System.out.println(f3(40));
System.out.println(f4(40));
System.out.println(f5(40, 1, 1));
}
/**
* 递归实现
*
* @param i
* @return
*/
static int f1(int i) {
if (i == 1 || i == 2)
return 1;
else
return f1(i - 1) + f1(i - 2);
}
/**
* while循环实现
*
* @param n
* @return
*/
static int f2(int n) {
int count = 1;
int Fn_1 = 1;
int Fn_2 = 1;
while (n > 2) {
Fn_2 = Fn_1;
Fn_1 = count;
count = Fn_1 + Fn_2;
n--;
}
return count;
}
/**
* 循环数组实现
*
* @param n
* @return
*/
static int f3(int n) {
int arr[] = new int[n];
arr[0] = arr[1] = 1;
for (int i = 2; i < arr.length; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
return arr[n - 1];
}
/**
* for循环实现
*
* @param n
* @return
*/
static int f4(int n) {
int a = 1, b = 1, c = 0;
// 因为前面还有两个1、1 所以i<=(n-2)
for (int i = 1; i <= (n - 2); i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
/**
* 尾递归实现
*
* @param n
* @param ret1
* @param ret2
* @return
*/
static int f5(int n, int ret1, int ret2) {
if (n == 1) {
return ret1;
}
return f5(n - 1, ret2, ret1 + ret2);
}
}