Java面向对象方式(观察者模式)解决菲波拉契数列问题(兔子三岁后就可以生小兔子)

偶然看到了关于这个数学问题,就在想怎么用面向对象的方式解决问题.小弟利用蹩脚的Java语言和刚学到的观察者模式,想到了一个小办法.大家有兴趣看看吧!

原题如下:

有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

程序:

// 周期对象,控制时间自动增长,被观察的对象
class Clock extends Observable {
	private static Clock clock;
	public static int rabbitcount = 0; // 现有兔子数量

	public static Clock getInstance() { // 单例模式,大家公用一个时间
		if (clock == null) {
			clock = new Clock();
		}
		return clock;
	}

	public void run() { // 时间开始走动
		for (int i = 1; i <= 12; i++) { // 12个月
			this.setChanged();
			this.notifyObservers(i); // 唤醒观察者
			System.out.println("面向对象思想:第" + i + "个月的兔子数量是:" + rabbitcount);
		}
	}
}

class Rubbit implements Observer { // 兔子(观察者:观察时间)
	int birthMoth;

	public Rubbit(int birthMoth) { // 初始化兔子的出生时间
		this.birthMoth = birthMoth;
	}

	public void update(Observable o, Object month) {
		Integer now = (Integer) month;
		if (now - birthMoth >= 2) { // 如果兔子达到三岁就可以生出一对小兔子
			Clock.rabbitcount += 1; // 兔子的数量增加一对
			Clock.getInstance().addObserver(new Rubbit(now)); // 将小兔子变成观察者,并告诉它自己出生的时间
		}
	}

}

public class RubbitCount {
	// 数学思想
	public static void count() {
		int f1 = 1;
		int f2 = 1;
		int f = 0;
		int M = 12;
		System.out.println("普通数学思想:第1个月的兔子数量是:" + f2);
		System.out.println("普通数学思想:第2个月的兔子数量是:" + f2);
		for (int i = 3; i <= M; i++) {
			f = f2;
			f2 = f1 + f2;
			f1 = f;
			System.out.println("普通数学思想:第" + i + "个月的兔子数量是:" + f2);
		}
	}

	public static void main(String[] args) {
		// 面向对象设计思想----------
		Clock.getInstance().addObserver(new Rubbit(1));
		Clock.rabbitcount += 1;
		Clock.getInstance().run();

		// 数学思想
		count();
	}

}


程序结果:
面向对象思想:第1个月的兔子数量是:1
面向对象思想:第2个月的兔子数量是:1
面向对象思想:第3个月的兔子数量是:2
面向对象思想:第4个月的兔子数量是:3
面向对象思想:第5个月的兔子数量是:5
面向对象思想:第6个月的兔子数量是:8
面向对象思想:第7个月的兔子数量是:13
面向对象思想:第8个月的兔子数量是:21
面向对象思想:第9个月的兔子数量是:34
面向对象思想:第10个月的兔子数量是:55
面向对象思想:第11个月的兔子数量是:89
面向对象思想:第12个月的兔子数量是:144
普通数学思想:第1个月的兔子数量是:1
普通数学思想:第2个月的兔子数量是:1
普通数学思想:第3个月的兔子数量是:2
普通数学思想:第4个月的兔子数量是:3
普通数学思想:第5个月的兔子数量是:5
普通数学思想:第6个月的兔子数量是:8
普通数学思想:第7个月的兔子数量是:13
普通数学思想:第8个月的兔子数量是:21
普通数学思想:第9个月的兔子数量是:34
普通数学思想:第10个月的兔子数量是:55
普通数学思想:第11个月的兔子数量是:89
普通数学思想:第12个月的兔子数量是:144

                                                  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值