主要内容:
- 斐波那契数列(兔子问题)
- 递归算法和递推算法
斐波那契数列(兔子问题)
问题描述:刚出生的兔子,长到第三个月开始(忽略月份大小)就可以繁殖下一代。假如1月1日抱来一公一母两只兔子,那么3月1日时,就会生出第一代兔子,并且正好也是一公一母。假设兔子没有死亡,每代兔子都可以正常繁殖下一代,那么计算抱来一对兔子第N月时,兔子的总量是多少对。(刚抱来算第一个月)
观察可知,从第三月开始,每个月的兔子总量等于前两个月的兔子总量之和,由此,便很容易确定其可以用斐波那契数列的思路来解决。
公式:Fib(n)=Fib(n-1)+Fib(n-2),n>3
现在来使用代码实现,我使用的是java来实现
递归算法和递推算法
package lucas;
import java.util.Scanner;
/**兔子问题<br/>
* 问题描述:<br/>
* 刚出生的兔子,长到第三个月开始(忽略月份大小)就可以繁殖下一代。<br/>
* 假如1月1日抱来一公一母两只兔子,那么3月1日时,就会生出第一代兔子,并且正好也是一公一母。<br/>
* 假设兔子没有死亡,每代兔子都可以正常繁殖下一代,
* 那么计算抱来一对兔子第N月时,兔子的总量是多少对。(刚抱来算第一个月)
* @author LENOVO
*
*/
public class Rabbit {
//递归,斐波那契数列
public static double Fib(double n){
if(n==1.0||n==2.0){
return 1.0;
}else{
return Fib(n-1.0)+Fib(n-2.0);
}
}
public static void main(String[] args) {
/*
* 由题意可知,兔子序列从第三个月开始,
* 每个月的数据是前两个月的和,所以很容易想到递归
* 使用double(8字节)可以容纳很大的数字
* 用递归很慢,只适合小一点的数字。
* */
double f,n;
System.out.print("抱来兔子的第N月:");
Scanner sc=new Scanner(System.in);
n=sc.nextDouble();
System.out.print("当前兔子总量(对):");
f=Fib(n);
System.out.format("%.0f",f);
}
}
得到的结果(真的很慢):
兔子的增长序列是斐波那契数列,所以考虑使用递推算法。
递推算法要比递归速度快很多,空间占用也少很多。
package lucas;
import java.util.Scanner;
/**兔子的增长序列是斐波那契数列,所以考虑使用
* 递推算法。<br/>
* 递推算法要比递归速度快很多,空间占用也少很多。
* @author LENOVO
*
*/
public class Rabbit2 {
public static void main(String[] args) {
double f,n,i;
double a,b;//存储前2个月兔子总量
System.out.println("抱来兔子的第n月:");
Scanner sc=new Scanner(System.in);
n=sc.nextDouble();
a=b=f=1.0;
//从第3月才开始累加
for(i=3.0;i<=n;i++){
f=a+b;//计算第i月的数量
a=b;
b=f;
}
System.out.print("当前兔子总量(对)");
System.out.format("%.0f",f);
}
}
结果显示(真的是秒速):
参考自:http://www.cnblogs.com/kangjianwei101/p/5221542.html