初学者定时器线程程序回答一个谜语

本文关键字:一个 谜语 定时器 线程 程序 初学者 | 更新日期: 2023-09-27 17:50:55

所以我试图通过写一个程序来回答我的朋友在面试中遇到的问题:"在两秒的时间标记处,一只蚊子开始每秒钟产卵另一只蚊子。从t = 0时的一只蚊子开始,8.5秒后会有多少只蚊子?"

public class ok
    {
        public static int num;
        public static void mosquito()
        {
            Task.Delay(1000);
            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Elapsed += OnTimedEvent;
            aTimer.Interval = 1000;
            aTimer.Enabled = true;
        }
        // Specify what you want to happen when the Elapsed event is raised.
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            num++;
            ThreadStart mos = mosquito;
        }
    }
public static void Main()
        {
            ok.mosquito();
            SendWithDelay();
            Console.WriteLine("Press a key to exit");
            Console.ReadKey();
        }
        // Prints mosquito count after 8.5 seconds
        private static async Task SendWithDelay()
        {
            await Task.Delay(8500);
            Console.WriteLine(ok.num);
        }

这是我试图写的简单代码,但显然失败了。我试着阅读任务API并以更好的方式理解发生了什么,我知道我需要确保访问变量"num",它跟踪蚊子计数是线程安全的,但我对此相当生锈。

帮助将是非常感激的。谢谢!

初学者定时器线程程序回答一个谜语

把问题转过来,所有出生两秒的蚊子都会产生另一只蚊子,所以我们需要一点历史记录,让我们使用一个数组:

int[9] mosquitoHistory;

从计时器开始让事情变得复杂,假设事情每秒发生一次,让我们使用循环。

for (i = 0, i++, i < 9)
{

如果我们能得到2s前的蚊子数量

int matureMosquitos = (seconds-2 >= 0 ? mosquitoHistory[seconds-2] : 0);

写出这一秒蚊子的数量,即我们上一秒有多少蚊子加上成熟蚊子的数量。

mosquitoHistory[seconds] = (seconds-1 >= 0 ? mosquitoHistory[seconds-1] : 1) + matureMosquitos;

并输出结果

Console.WriteLine(mosquitoHistory[seconds]); 

最后,如果你想让它模拟睡一秒钟:

Threading.Thread.Sleep(1000);

把它们放在一起,这就是你得到的。

using System;
public class Program
{
    public static void Main()
    {
        int[] mosquitoHistory = new int[9];
        for (int seconds = 0; seconds < 9; seconds++)
        {
            int matureMosquitos = (seconds-2 >= 0 ? mosquitoHistory[seconds-2] : 0);
            mosquitoHistory[seconds] = (seconds-1 >= 0 ? mosquitoHistory[seconds-1] : 1) + matureMosquitos;                 
            Console.WriteLine(mosquitoHistory[seconds]); 
            Threading.Thread.Sleep(1000);
        }
    }
}

我得到34只蚊子

这是一个简单的离散2^n算法。

2s mark we have 1 + 1 = 2
3s mark we have 1 + 1 + 2 = 4
4s mark we have 1 + 1 + 2 + 4 = 8
5s mark we have 1 + 1 + 2 + 4 + 8 = 16

等。

代码示例

var numMosqito = 1;
for (float time = 0; time  <= 8.5; time ++)
{
     if (time  >= 2)
         numMosqito += numMosqito;

     Console.WriteLine("{0}, {1}", time, numMosqito);
}
Console.ReadLine();