斐波那契(面向对象方法实现和规律实现两种方法)
2014-02-15 15:25
302 查看
准备年后跳槽 找了些简单的面试题 练练手
import java.util.ArrayList;
import java.util.List;
public class 斐波拉契 {
public static void main(String[] args) {
for(int i=1;i<=9;i++){
//面向对象方法
System.out.println("第"+i+"个月的兔子数"+new RabbitManager().getAll(i));
//第二种方法(规律 简单暴力)
System.out.println("第"+i+"个月的兔子数"+rabbitsMonth(i));
}
}
//按照规律来找 比较简单
//定义三种兔子 一个月大的小兔子 两个月大的中兔子 三个月及以上的大兔子
//小=大+中
//大=中+大
//中=小
public static int rabbitsMonth(int month){
int a = 0; //大
int b = 0; //中
int c = 1; //小
if(month == 1){
return (a+b+c);
}
for(int i=2;i<=month;i++){
int tempC = c;
c = a + b;
a = a + b;
b = tempC;
}
return (a+b+c);
}
}
class PairRabbit{
// 1 ,2 ,3
private int age;
private List childen = new ArrayList();
public PairRabbit(){
this.age = 1;
}
//生产小兔子的方法
public void makeRabbit(){
PairRabbit rabbit = null ;
if(age<0) return;
switch(age){
case 1 :
break;
case 2 :
break;
default:
rabbit = new PairRabbit();
if(childen.size()>0){
for(PairRabbit p : childen){
p.setAge(p.getAge()+1);
}
}
childen.add(rabbit);
break;
}
}
//获取这对兔子的所有孩子的对数
public int getChildNum(){
int childNum = 0;
for(int i=0;i<(age-2);i++){
makeRabbit();
}
childNum = getChilden().size();
return childNum;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List getChilden() {
for(int i=0;i<(getAge()-2);i++){
makeRabbit();
}
return childen;
}
public void setChilden(List childen) {
this.childen = childen;
}
}
class RabbitManager{
//所有兔子的子孙
List all ;
public RabbitManager(){
all = new ArrayList();
}
//通过第一对兔子获取他所有的子孙兔子 好比根节点获取所有衍生出来的子节点
public void getAllChilden(PairRabbit rp){
List rabbits = rp.getChilden();
all.addAll(rabbits);
if(rabbits.size()>0){
for(PairRabbit rp1 : rabbits){
getAllChilden(rp1);
}
}
}
//返回所有兔子的数量
public int getAll(int month){
int sum = 0;
PairRabbit rp = new PairRabbit();
rp.setAge(month);
getAllChilden(rp);
sum = all.size()+1;
return sum;
}
}
import java.util.ArrayList;
import java.util.List;
public class 斐波拉契 {
public static void main(String[] args) {
for(int i=1;i<=9;i++){
//面向对象方法
System.out.println("第"+i+"个月的兔子数"+new RabbitManager().getAll(i));
//第二种方法(规律 简单暴力)
System.out.println("第"+i+"个月的兔子数"+rabbitsMonth(i));
}
}
//按照规律来找 比较简单
//定义三种兔子 一个月大的小兔子 两个月大的中兔子 三个月及以上的大兔子
//小=大+中
//大=中+大
//中=小
public static int rabbitsMonth(int month){
int a = 0; //大
int b = 0; //中
int c = 1; //小
if(month == 1){
return (a+b+c);
}
for(int i=2;i<=month;i++){
int tempC = c;
c = a + b;
a = a + b;
b = tempC;
}
return (a+b+c);
}
}
class PairRabbit{
// 1 ,2 ,3
private int age;
private List childen = new ArrayList();
public PairRabbit(){
this.age = 1;
}
//生产小兔子的方法
public void makeRabbit(){
PairRabbit rabbit = null ;
if(age<0) return;
switch(age){
case 1 :
break;
case 2 :
break;
default:
rabbit = new PairRabbit();
if(childen.size()>0){
for(PairRabbit p : childen){
p.setAge(p.getAge()+1);
}
}
childen.add(rabbit);
break;
}
}
//获取这对兔子的所有孩子的对数
public int getChildNum(){
int childNum = 0;
for(int i=0;i<(age-2);i++){
makeRabbit();
}
childNum = getChilden().size();
return childNum;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List getChilden() {
for(int i=0;i<(getAge()-2);i++){
makeRabbit();
}
return childen;
}
public void setChilden(List childen) {
this.childen = childen;
}
}
class RabbitManager{
//所有兔子的子孙
List all ;
public RabbitManager(){
all = new ArrayList();
}
//通过第一对兔子获取他所有的子孙兔子 好比根节点获取所有衍生出来的子节点
public void getAllChilden(PairRabbit rp){
List rabbits = rp.getChilden();
all.addAll(rabbits);
if(rabbits.size()>0){
for(PairRabbit rp1 : rabbits){
getAllChilden(rp1);
}
}
}
//返回所有兔子的数量
public int getAll(int month){
int sum = 0;
PairRabbit rp = new PairRabbit();
rp.setAge(month);
getAllChilden(rp);
sum = all.size()+1;
return sum;
}
}
相关文章推荐
- 斐波那契数列的两种实现方法
- java实现斐波那契的两种方法
- 斐波那契的两种实现方法
- java实现斐波那契的两种方法
- 在servlet中实现页面跳转的两种方法
- 关于把一个无符号数的二进制位翻转的两种实现方法
- 陈华:两种方法实现查找数组最大值
- 两种方法使用js读写cookie实现一个底部广告浮层效果
- 实现树状结构的两种方法
- 【Java并发编程】之十五:并发编程中实现内存可见的两种方法比较:加锁和volatile变量
- Sql字符串分组Split函数的两种实现方法(转)
- C#调用SAPI实现语音识别的两种方法
- 两种方法实现10进制和62进制互转
- 在ASP.Net中两种利用CSS实现多界面的方法
- 用CSS实现水平虚线的两种方法
- SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法
- 交换机环境下实现同vlan不能互通却都能访问服务器的两种方法
- 比较洗牌算法的两种实现方法
- 两种方法(递归,非递归)实现单链表的逆转
- 关于实现自定义Dialog和实现Dialog里view的事件监听的两种方法