【发布时间】:2022-07-13 21:13:45
【问题描述】:
我正在尝试使用 c# 代码重写此 question 的答案。由于 C# 尚未普及,而且我们会出现超出范围的异常,因此这是一项艰巨的任务。我设法编写了以下代码,它可以工作,但我相信有更好的方法来做到这一点。
int? result = MaxCollectableTreasure(new List<int?>() {1, 3, 1, 8, 7 }, 3);
int? MaxCollectableTreasure(List<int?> chests, int minutes)
{
if (chests.Count == 1 && minutes > 0)
return chests[0];
int? firstElement = chests[0];
var restOfList = chests.Skip(1).Take(chests.Count).ToList();
return MaxCollectableTreasuresRecursive(firstElement, restOfList, minutes);
}
int? MaxCollectableTreasuresRecursive(int? firstElement, List<int?> chests, int minutes)
{
if (minutes == 0 || firstElement is null)
return 0;
if (firstElement == 0)
return MaxCollectableTreasuresRecursive(chests.FirstOrDefault(), AllButFirst(chests), minutes - 1);
var left = firstElement + MaxCollectableTreasuresRecursive(0, AllButFirst(chests.Prepend(0)), minutes - 1);
var right = MaxCollectableTreasuresRecursive(chests.FirstOrDefault(), AllButFirst(chests), minutes - 1);
int leftAsInt = left ?? 0;
int rightAsInt = right ?? 0;
return Math.Max(leftAsInt, rightAsInt);
}
List<int?> AllButFirst(IEnumerable<int?> chests)
{
return chests.Skip(1).Take(chests.Count()).ToList();
}
【问题讨论】:
标签: c#