检查arraylist是否是斐波那契数列的一部分c#
Check if arraylist is part of fibonacci sequence c#
我在这个 link 上找到了类似的解决方案 ,但我想要在 c# 中使用它。我托盘在 c# 中转换它,但它不起作用。谁能帮帮我,告诉我哪里错了。
static void Main(string[] args)
{
List<int> list = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
Console.WriteLine(isFibonacci(list));
Console.ReadLine();
}
public static bool isFibonacci(List<int> arr)
{
if (arr.Count() < 3)
{
return false;
}
int fib1 = 0;
int fib2 = 1;
while (fib1 < arr.IndexOf(0))
{
int tmp = fib1 + fib2;
fib1 = fib2;
fib2 = tmp;
}
if (fib1 != arr.IndexOf(0))
{
return false;
}
if (fib2 != arr.IndexOf(1))
{
return false;
}
for (int i = 2; i < arr.Count(); i++)
{
if (arr.IndexOf(i) < 0)
return false;
// I think that problem is in this part of code
if (arr.IndexOf(i) != (arr.IndexOf(i - 1) + arr.IndexOf(i - 2)))
return false;
}
return true;
}
List.IndexOf方法returns指定为参数的元素索引:https://msdn.microsoft.com/en-us/library/e4w08k17%28v=vs.110%29.aspx
您不是更想获取指定索引处的元素吗,即 arr[i]?
更新源代码:
static void Main(string[] args)
{
List<int> list = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
Console.WriteLine(isFibonacci(list));
Console.ReadLine();
}
public static bool isFibonacci(List<int> arr)
{
if (arr.Count() < 3)
{
return false;
}
int fib1 = 0;
int fib2 = 1;
while (fib1 < arr[0])
{
int tmp = fib1 + fib2;
fib1 = fib2;
fib2 = tmp;
}
if (fib1 != arr[0])
{
return false;
}
if (fib2 != arr[1])
{
return false;
}
for (int i = 2; i < arr.Count(); i++)
{
if (arr[i] < 0)
return false;
// I think that problem is in this part of code
if (arr[i] != (arr[i - 1] + arr[i - 2]))
return false;
}
return true;
}
这不是问题的直接答案。我只是认为在 LINQ 中执行此操作会很有趣。
你可以这样做:
public static bool isFibonacci(List<int> arr)
{
return
arr
.Zip(
arr.Skip(1),
(x0, x1) => new { x0, x1 })
.Zip(
arr.Skip(2),
(x01, x2) => x01.x0 + x01.x1 - x2 == 0)
.All(x => x);
}
或者使用交互式扩展 (NuGet "Ix-Main"):
public static bool isFibonacci(List<int> arr)
{
return arr.Buffer(3, 1).Where(x => x.Count == 3).All(x => x[0] + x[1] == x[2]);
}
我在这个 link 上找到了类似的解决方案
static void Main(string[] args)
{
List<int> list = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
Console.WriteLine(isFibonacci(list));
Console.ReadLine();
}
public static bool isFibonacci(List<int> arr)
{
if (arr.Count() < 3)
{
return false;
}
int fib1 = 0;
int fib2 = 1;
while (fib1 < arr.IndexOf(0))
{
int tmp = fib1 + fib2;
fib1 = fib2;
fib2 = tmp;
}
if (fib1 != arr.IndexOf(0))
{
return false;
}
if (fib2 != arr.IndexOf(1))
{
return false;
}
for (int i = 2; i < arr.Count(); i++)
{
if (arr.IndexOf(i) < 0)
return false;
// I think that problem is in this part of code
if (arr.IndexOf(i) != (arr.IndexOf(i - 1) + arr.IndexOf(i - 2)))
return false;
}
return true;
}
List.IndexOf方法returns指定为参数的元素索引:https://msdn.microsoft.com/en-us/library/e4w08k17%28v=vs.110%29.aspx
您不是更想获取指定索引处的元素吗,即 arr[i]?
更新源代码:
static void Main(string[] args)
{
List<int> list = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
Console.WriteLine(isFibonacci(list));
Console.ReadLine();
}
public static bool isFibonacci(List<int> arr)
{
if (arr.Count() < 3)
{
return false;
}
int fib1 = 0;
int fib2 = 1;
while (fib1 < arr[0])
{
int tmp = fib1 + fib2;
fib1 = fib2;
fib2 = tmp;
}
if (fib1 != arr[0])
{
return false;
}
if (fib2 != arr[1])
{
return false;
}
for (int i = 2; i < arr.Count(); i++)
{
if (arr[i] < 0)
return false;
// I think that problem is in this part of code
if (arr[i] != (arr[i - 1] + arr[i - 2]))
return false;
}
return true;
}
这不是问题的直接答案。我只是认为在 LINQ 中执行此操作会很有趣。
你可以这样做:
public static bool isFibonacci(List<int> arr)
{
return
arr
.Zip(
arr.Skip(1),
(x0, x1) => new { x0, x1 })
.Zip(
arr.Skip(2),
(x01, x2) => x01.x0 + x01.x1 - x2 == 0)
.All(x => x);
}
或者使用交互式扩展 (NuGet "Ix-Main"):
public static bool isFibonacci(List<int> arr)
{
return arr.Buffer(3, 1).Where(x => x.Count == 3).All(x => x[0] + x[1] == x[2]);
}