• 兔子问题


    问题:

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

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

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

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

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

    谢谢!  

  • 相关阅读:
    【Android开发学习笔记】【高级】【随笔】插件化——初探
    【Android测试】【第十三节】Uiautomator——如何组织好你的测试代码(项目实战)
    【Android测试】【第十二节】Uiautomator——API详解
    【Android测试】【第十一节】Uiautomator——简介
    【Android测试】【第十节】MonkeyRunner—— 录制回放
    【Android测试】【第九节】MonkeyRunner—— 初识
    poj 1475 推箱子
    leetcode Ch3-DFS & Backtracking I
    Windows Socket和Linux Socket编程的区别 ZZ
    Linux网络编程入门 (转载)
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/5591777.html
Copyright © 2020-2023  润新知