前言: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.可能是什么问题?