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