在while循环中向Array添加值

时间:2014-05-27 23:12:30

标签: c# fibonacci

我正在制作一个运行Fibonacci系列的程序。我创建了2个数组。

  1. 第一个数组只保存0,1(数组名称: - int [] arr)

  2. 第二个数组包含其他值,例如:1,2,3,5 ..........等(数组名称: - int []数字)

  3. 我正在使用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");
        }
    }
    

2 个答案:

答案 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();