zoukankan      html  css  js  c++  java
  • 兔子问题

    问题:

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

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

      则投放一对兔子,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.如果年份过长,或初始兔子数量太多,会爆出内存溢出。

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

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

    谢谢!  

  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/5591777.html
Copyright © 2011-2022 走看看