无法返回两个以上Zeckendorf表示的操作数

时间:2016-07-11 05:23:16

标签: c# math sequence fibonacci addition

前言:Zeckendorf代表

该数学定理表明,对于每个数n,在Fibonacci序列中都存在k个加法操作数{0,1,1,2,3,5等}。例如,我们得到100.为了找到它的Zeckendorf表示,我们首先必须找到Fibonacci序列中存在的小于或等于100的最大值。在这种情况下,它是89. 100-89是11.重复的相同过程给我们8,然后是3.因此89 + 8 + 3 = 100.这适用于所有数字。如果你有一台强大的计算机没有大数字溢出,并且如果你有一个监控数学的编程语言来保存具有大数值的数字,你可以计算几乎任何给定数字的Zeckendorf表示。

然而,由于我们使用C#,类型和数量有多大,我们在处理Zeckendorf表示时必须小心谨慎。我使用long来保存我的数字,并计算了第二个斐波纳契数列。

    static void Fbonacci_Init(int roof)
    {
        for (int i = 1; i < roof; i++) //where roof = 20
        {
            Fibonacci.Add(Fibonacci[i - 1] + Fibonacci[i]);
        }                    
    }

然后我创建了两个public static列表作为字段:

    public static List<long> Fibonacci = new List<long>() { 0, 1 };
    public static List<long> ZeckendorfRep = new List<long>();

然后创建一个名为FindLesser的函数,而不是找到小于或等于long given argument的值,并将其添加到ZeckendorfRep

    static void FindLesser(long number)
    {


        for (int i = Fibonacci.Count - 1; i >= 0; i--)
        {
            if (Fibonacci[i] <= number)
            {

                ZeckendorfRep.Add(Fibonacci[i]);
                 break;                             

            }

        }

    }

调用Difference的函数用于FindLesser()和它自身的递归:

    static void Difference(long init)
    {

        FindLesser(init - ZeckendorfRep[0]);

        long summation = ZeckendorfRep.Sum();

        if (summation != init)
        {
            for (int i = 1; i < ZeckendorfRep.Count; i++)
            {
                long difference = ZeckendorfRep[i] - ZeckendorfRep[i - 1];
                FindLesser(difference);
                Difference(difference);
            }
        }

    }

然后我用参数long input调用每个函数,Console.ReadLine()

无论如何,代码无法正常工作。它只返回给定表示的前两个操作数,例如,对于100,它只返回89和8.可能是什么问题?

0 个答案:

没有答案