使用C# .NET 7 写一个 高性能、多线程 斐波那契 算法

107 阅读1分钟
using System.Collections.Concurrent;
ConcurrentDictionary<ulong, ulong> ConPairs = new(); //多线程字典、防止同时访问

if (!args.Any())
{
    throw new Exception("请在参数中输入你要递归的斐波那契运算");
}

List<ulong> nums = new();


try
{
	ulong numSize =(ulong)Convert.ToInt64(args[0]);
	for (ulong i = 1; i <= numSize; i++)
	{
		nums.Add(i);
	}
}catch(Exception e)
{
	throw new Exception("参数错误,无法解析", e);
}

/*

AsParallel() 并行处理下面的任务
Select() 对每个元素操作处理
OrderBy() 对元素排序
ToList() 转换为List

 */

List<ulong> fbi = nums.AsParallel().Select(n =>FbiNum(n,ref ConPairs)).OrderBy(n=>n).ToList();



Console.WriteLine( "结果:" );

fbi.ForEach(e =>
{
	Console.WriteLine(e);
});

//实现一个简单的有缓存的 斐波那契
static ulong FbiNum(ulong num,ref ConcurrentDictionary<ulong, ulong> dic)
{
	if(num == 1) return 0;
	if(num == 2) return 1;
	ulong getNum;
	ulong result;
	if (dic.TryGetValue(num,out getNum))
	{
		result = getNum;
	}
	else
	{
		result = FbiNum(num - 1, ref dic) + FbiNum(num - 2, ref dic);
		dic.TryAdd(num, result);
		Console.WriteLine($"加入缓存: {result}");
	}
	return result;
}