【问题标题】:Check if arraylist is part of fibonacci sequence c#检查arraylist是否是斐波那契序列c#的一部分
【发布时间】:2016-05-15 12:37:49
【问题描述】:

我在此链接上找到了类似的解决方案 Java: check if arraylist is part of fibonacci sequence,但我希望在 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;
     }

【问题讨论】:

  • 代码乍一看似乎是正确的。 “不起作用”到底是什么意思?
  • 你能说出你的代码返回 false 的值吗?
  • 我在代码中我认为有错误的地方添加了注释。

标签: c# list fibonacci


【解决方案1】:

List.IndexOf 方法返回指定为参数的元素的索引: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;
    }

【讨论】:

  • 他可以使用[] 而不是IndexOf(),但这将如何解决问题?
  • 在 c# 中,索引器 []IndexOf() 方法不等效。 ElementAt() 相当于一个索引器。
  • 天哪,你是对的!我在这段代码中经常读到这个IndexOf,但它并没有击中我。所以实际上我的回答可能是完全错误的。
  • @rené-vogt:你为什么不赞成我的回答?问题不在于所选的集合类型,List&lt;T&gt; 可以很好地保存重复项;问题在于 IndexOf() 方法的错误使用。请删除您的反对票。
  • 如我之前所说,我是盲目和错误的,认为你的回答根本解决不了问题。在你向我展示我的错误之后,我再次取消了反对票并支持了你的答案,并告诉 OP 接受你的答案,就像他现在所做的那样。对于不正确的投票,我深表歉意。
【解决方案2】:

这不是问题的直接答案。我只是觉得在 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]);
}

【讨论】:

    猜你喜欢
    • 2016-09-03
    • 2019-02-23
    • 2012-11-09
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多