我正在制作一个运行Fibonacci系列的程序。我创建了2个数组。
第一个数组只保存0,1(数组名称: - int [] arr)
第二个数组包含其他值,例如:1,2,3,5 ..........等(数组名称: - int []数字)
我正在使用while循环来获取febonacci系列并将其存储在名为int [] number的第二个数组中。
使用while循环获取值后,我使用
加入两个数组int[] final = arr.Concat(number).ToArray();
最后,我使用了foreach循环将febonacci系列添加到列表框中。
我遇到的问题是,我无法连接这两个数组。我试图在while循环的顶部分配数字数组。这样数字变量就可以在while循环之外访问。但我收到了一个错误。
请参阅以下代码:
private void button1_Click(object sender, EventArgs e)
{
int x = 0;
int y = 1;
int z = 0;
if (!String.IsNullOrEmpty(q1input.Text))
{
int value;
if (int.TryParse(q1input.Text, out value))
{
int[] arr = {x, y };
while (z < value)
{
z = x + y;
int[] number = {z};
x = y;
y = z;
}
int[] final = arr.Concat(number).ToArray();
foreach (int num in final)
{
q2listbox.Items.Add(num);
}
}
else
{
MessageBox.Show("It is not a numeric value");
}
}
else
{
MessageBox.Show("Invalid Input");
}
}
答案 0 :(得分:1)
如果您分开您的关注点可能有所帮助:计算Fibonacci序列应该与您的用户界面代码分开。
你的部分问题是你正在使用C#中的数组(固定长度)来构建长度可调的东西。 List<T>
是一个更适合您的数据结构。尽管它具有误导性的名称,但它是一个可调整长度的数组,而不是计算机科学意义上的实际列表。
生成Fibonacci序列并不像你做的那么复杂。这个实现:
public int[] FibonacciSequence( int x1 , int x2 , int upperBound )
{
if ( x1 < 0 ) throw new ArgumentException("x1 can't be negative") ;
if ( x2 < 0 ) throw new ArgumentException("x2 can't be negative") ;
if ( x1 == 0 && x2 == 0 ) throw new ArgumentException("x1 and x2 can't both be zero.") ;
List<int> values = new List<int>() ; // use List<int>, since we don't know the length in advance
values.Add(x1) ; // the first 2 elements are given
values.Add(x2) ;
// the remaining elements are computed by summing the previous two elements and shifting.
for ( int x = x1+x2 ; x > 0 && x < upperBound ; x = x1+x2 )
{
// add the new value to the list of values
values.Add(x) ;
x1 = x2 ; // x1 receives x2 (with the current x1 shifting off into oblivion
x2 = x ; // x2 receives x
}
int[] sequence = values.ToArray() ;
return sequence ;
}
Fibonacci序列以[0,1]或[1,1]开头,没有规则,只是惯例。然后,您可以使用所需的种子调用此函数,因此:
int[] fibonacci = FibonacciSequence(1,1,int.MaxValue) ;
Fibonacci序列的一个很酷的事情是无论种子值如何,你在序列中走得越远,任何两个相邻值的比率会收敛于 phi ,即中庸。< / p>
更简单的是使用一些LINQ的功能兼魔法。使用它,您的Fibonnaci序列变得更加简单:
public IEnumerable<int> FibinacciSequence( int x1 , int x2 )
{
yield return x1 ;
yield return x2 ;
for ( int x = x1+x2 ; x > 0 && x < int.MaxValue ; x = x1+x2 )
{
yield return x ;
x1 = x2 ;
x2 = x ;
}
}
它的用法如下:
int[] sequence = FibonacciSequence(1,1)
.TakeWhile( x => x < upperBound )
.ToArray()
;
您甚至可以跳过“ToArray()
位,只需说出
foreach ( int value in FibonacciSequence(1,1).TakeWhile( x => x < upperBound ) )
{
q2listbox.Items.Add( value ) ;
}
,当您将每个值添加到列表框时,它将以惰性方式评估序列。
答案 1 :(得分:0)
List<int> number = new List<int>();
while (z < value)
{
z = x + y;
number.Add(z);
x = y;
y = z;
}
int[] final = arr.Concat(number).ToArray();