递归算法Q1——斐波那契数列
有一对兔子,从出生后第3个月起,每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子。
假如兔子都不死,求第n个月兔子对数
关于斐波那契数列的兔子繁殖问题其实如下:
实际月份 1 2 3 4 5 6 7 8
幼仔对数 1 0 1 1 2 3 5 8
成兔对数 0 1 1 2 3 5 8 13
总体对数 1 1 2 3 5 8 13 21
幼仔对数=前月成兔对数
成兔对数=前月成兔对数+大前月幼仔对数
总体对数=本月成兔对数+本月幼仔对
package 递归;
public class 斐波那契数列 {
int fib0(int n) {
if(n<=2) return 1;
return fib0(n-2)+fib0(n-1);
}
int fib1(int n) {
if(n<=2) return 1;
int [] nums=new int[n+1];
return fib1(n,nums);
}
int fib1(int n,int []nums) {
if(n<=2) return 1;
if(nums[n]==0) {
nums[n]=fib1(n-1,nums)+fib1(n-2,nums);
}
return nums[n];
}
int fib2(int n) {
if(n<=2) return 1;
int []fib=new int[n+1];
fib[1]=fib[2]=1;
for(int i=3;i<=n;i++) {
fib[i]=fib[i-1]+fib[i-2];
}
return fib[n];
}
int fib3(int n) {
if(n<=2) return 1;
int []fib=new int[n];
fib[0]=fib[1]=1;
for(int i=3;i<=n;i++) {
fib[i&1]=fib[(i-1)&1]+fib[(i-2)&1];
}
return fib[n&1];
}
int fib4(int n) {
if(n<=2) return 1;
int first=1;
int second=1;
for(int i=3;i<=n;i++) {
first=first+second;
second=first-second;
}
return first;
}
int fib5(int n) {
if(n<=2) return 1;
int first=1;
int second=1;
int third=0;
for(int i=3;i<=n;i++) {
third=first+second;
first=second;
second=third;
}
return third;
}
public static void main(String[] args) {
斐波那契数列 a=new 斐波那契数列();
System.out.println(a.fib0(6));
System.out.println(a.fib1(6));
System.out.println(a.fib2(6));
System.out.println(a.fib3(6));
System.out.println(a.fib4(6));
System.out.println(a.fib5(6));
}
}