兔子问题

问题:

  有人想知道一对兔子可繁殖成多少对,便在大草原上筑了一道围墙,把一对兔子关在里面。

  已知一对兔子每一个月可以生一对小兔子,而一对小兔子出生后,第三个月开始生小兔子。兔子三岁后不再生育,之后一年死亡。

  则投放一对兔子,20年后回来草原上有多少兔子?

程序源码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Rabbit
{
    class Program
    {
        static void Main(string[] args)
        {
            LiveSystem system = new LiveSystem(2,15);
            List<RabbitOne> totalRabbit = system.Rabbits();
            Console.WriteLine("num:" + totalRabbit.Count);
            foreach (var one in totalRabbit)
            {
                Console.WriteLine("id:" + one.Id + " month:" + one.Month+" parent:"+one.Parent);
            }
            Console.Read();
        }
    }
    public class RabbitOne
    {
        private int id;
        private int month;
        private bool live;
        private string parent;

        public RabbitOne(int id, int month, string parent)
        {
            this.id = id;
            this.month = month;
            this.live = true;
            this.parent = parent;
        }

        public int Id
        {
            get { return id; }
        }
        public int Month
        {
            get { return month; }
        }

        public void Grow()
        {
            this.month++;
            
        }

        public bool Live()
        {
            if (this.month > 4 * 12)
            {
                return false;
            }
            return true;
        }

        public string Parent
        {
            get { return parent; }
        }
    }

    public class LiveSystem
    {
        private List<RabbitOne> _rabbits = new List<RabbitOne>();
        private int i = 0;
        public LiveSystem(int rabbitNum, int limitMonth)
        {
            while ((rabbitNum=rabbitNum - 1) >= 0)
            {
                _rabbits.Add(new RabbitOne(i, 0,""));
                i++;
            }
            Born();
            while ((limitMonth = limitMonth - 1) >= 0)
            {
                _rabbits.ForEach(m =>m.Grow());
                Born();
            }
        }

        public List<RabbitOne> Rabbits()
        {
            return _rabbits.Where(m =>m.Live()).ToList();
        }

        private void Born()
        {
            List<RabbitOne> canBornRabbits = _rabbits.Where(m => m.Month >= 3 && m.Month < 3 * 12).ToList();
            if (canBornRabbits.Count < 2) return;
            //优化:可用随机抽取获取2只兔子
            int canBorNum = (int) Math.Floor((double) (canBornRabbits.Count/2));
            while ((canBorNum = canBorNum - 1) >= 0)
            {
                _rabbits.Add(new RabbitOne(i, 0, "$" + canBornRabbits[canBorNum*2].Id + "$" + canBornRabbits[canBorNum * 2+1 ].Id ));
                i++;
            }
            
        }
    }
}

存在问题:

  1.如果年份过长,或初始兔子数量太多,会爆出内存溢出。

 

 

如果谁有更好的实现方法,欢迎在底下评论、交流。

如果有哪个地方实现的不好的地方,也欢迎指正。

谢谢!  

转载于:https://www.cnblogs.com/panpanwelcome/p/5591777.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值