C# 在Collatz序列中使用缓存实现问题

C# 在Collatz序列中使用缓存实现问题,c#,C#,我已经创建了两个列表,一个用于编号,一个用于链计数。如果编号在编号列表中,则获取其链数并将其添加到当前链数。我现在的问题是,这个程序死机了,没有给我任何回报。问题本身解决了,我花了4.7秒找到100万以下序列和链数最长的数字,但我想用缓存优化它 static List<long> cache_number = new List<long>(); static List<long> cache_chains = new List<long>(

我已经创建了两个列表,一个用于编号,一个用于链计数。如果编号在编号列表中,则获取其链数并将其添加到当前链数。我现在的问题是,这个程序死机了,没有给我任何回报。问题本身解决了,我花了4.7秒找到100万以下序列和链数最长的数字,但我想用缓存优化它

static List<long> cache_number = new List<long>();
    static List<long> cache_chains = new List<long>();

    static long CollatzChain(long num) {
        int chain = 1;
        while (num != 1) {
            if(cache_number.Contains(num)){
                long x = chain + cache_chains[cache_number.IndexOf(num)];
                return x;
            }
            if (num % 2 == 0) {
                num = num / 2;
            }
            else {
                num = 3 * num + 1;
            }
            chain++;     
        }
        cache_number.Add(num);
        cache_chains.Add(chain);
        return chain;
    }

    static void Main(string[] args){

        Stopwatch time = new Stopwatch();
        time.Start();

        List<long> chain = new List<long>();
        List<long> numbers = new List<long>();


        for (int i = 13; i < 1000000; i++) {
            numbers.Add(i);
            chain.Add(CollatzChain(i));
        }

        time.Stop();
        long elapsed = time.ElapsedMilliseconds;
        Console.WriteLine("The longest chain was made by number {0} with a chain of {1} elements", numbers[chain.IndexOf(chain.Max())], chain.Max());
        Console.Write("Time Elapsed: {0} ms", elapsed);
        Console.ReadKey();
    }
static List cache_number=new List();
静态列表缓存链=新列表();
静态长项圈链(长数值){
int-chain=1;
while(num!=1){
if(缓存号包含(num)){
长x=链+缓存链[cache_number.IndexOf(num)];
返回x;
}
如果(数值%2==0){
num=num/2;
}
否则{
num=3*num+1;
}
链++;
}
cache_number.Add(num);
缓存链。添加(链);
返回链;
}
静态void Main(字符串[]参数){
秒表时间=新秒表();
time.Start();
列表链=新列表();
列表编号=新列表();
对于(int i=13;i<1000000;i++){
增加(i);
链。添加(链(i));
}
时间。停止();
长时间运行=time.ElapsedMilliseconds;
WriteLine(“最长的链是由数字{0}和{1}元素链组成的”,数字[chain.IndexOf(chain.Max())],chain.Max());
写入(“经过的时间:{0}毫秒”,经过);
Console.ReadKey();
}