Возвращение Фибоначчи серии c # - PullRequest
0 голосов
/ 02 ноября 2018

Мне нужно создать метод, который возвращает n-е целое число в ряду Фибоначчи, код, который я написал (отредактировал), не работал, кто-нибудь может направить меня в мой раздел цикла for. Мне нужно использовать веб-форму и вернуть ряд Фибоначчи в конкретную точку.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

{
    public partial class Default : System.Web.UI.Page
    {
        int i, temp;

        public void Page_Load(object sender, EventArgs e)
        {

        }

        public int Fibonacci(int x)
        {
            if (x == 0)
            {
                return 1;
            }
            if (x == 1)
            {
                return 1;
            }
            else
            {
                return (Fibonacci(x - 2) + Fibonacci(x - 1));
            }

        }

        public void btSubmit_Click(object sender, EventArgs e)
        {
            // getting input from user
            int num = Convert.ToInt32(txtInput.Text);

            // logic for fibonacci series
            for (i = 0; i < num; i++)
            {
                lblResult.Text = Fibonacci(i).ToString();
            }

        }
    }

}

Ответы [ 4 ]

0 голосов
/ 02 ноября 2018

Прежде всего, мы, как правило, предполагаем

   F(0) = 0,
   F(1) = 1,
   ...
   F(N) = F(N - 1) + F(N - 2)   

См. https://oeis.org/A000045

Если вам нужна серия , давайте реализуем серию (с помощью IEnumerable<T> и yield return):

  using System.Linq;

  ... 

  //TODO: do you really want int as a return type? BigInteger seems to be a better choice 
  public static IEnumerable<int> Fibonacci() {
    int n_2 = 1; // your rules; or start Fibonacci from 1st, not 0th item
    int n_1 = 1;

    yield return n_2;             
    yield return n_1;

    while (true) {
      int n = n_2 + n_1;

      yield return n;

      n_2 = n_1;
      n_1 = n;
    }
  }

Имея генератор, мы можем легко взять num первые Fiboncacci числа ( Linq Take):

  lblResult.Text = string.Join(", ", Fibonacci().Take(num));        

В случае num == 7 мы получим

  1, 1, 2, 3, 5, 8, 13

Если вы хотите отдельный элемент - ElementAt (индекс на основе нуля ):

  // 8
  lblResult.Text = Fibonacci().ElementAt(5).ToString();
0 голосов
/ 02 ноября 2018

Вы можете использовать целочисленный массив, чтобы хранить числа Фибоначчи до n и возвращать n-е число Фибоначчи:

public int GetNthFibonacci_Ite(int n)  
{  
    int number = n - 1; //Need to decrement by 1 since we are starting from 0  
    int[] Fib = new int[number + 1];  
    Fib[0]= 0;  
    Fib[1]= 1;  
    for (int i = 2; i <= number;i++)  
    {  
        Fib[i] = Fib[i - 2] + Fib[i - 1];  
    }  
    return Fib[number];  
}

и тогда вы можете назвать это так:

GetNthFibonacci_Ite(7);

и он возвращает 7-е число Фибоначчи

0 голосов
/ 02 ноября 2018

Используйте метод Фибоначчи:

    public int Fibonacci(int n)
    {
        int a = 0;
        int b = 1;

        for (int i = 0; i < n; i++)
        {
            int temp = a;
            a = b;
            b = temp + b;
        }
        return a;
    }

И заменить:

lblResult.Text = Fibonacci(i).ToString();

Кому:

lblResult.Text += Fibonacci(i).ToString();
0 голосов
/ 02 ноября 2018

Ваша ошибка в том, что вы переписываете текст, а не добавляете к нему. Измените его на lblResult.Text += Fibonacci(i).ToString() для добавления.

Однако обратите внимание, что добавление большого количества текста из цикла в элемент графического интерфейса является проблематичной операцией. Вы несете огромные накладные расходы на чтение и написание графического интерфейса Elemetns. Это не имеет значения, если вы делаете это только один раз для события, инициируемого пользователем, но из цикла вы заметите это быстро.

Может быть, лучше построить последовательность в коде, а затем показать ее за один раз. Я даже написал пример кода, чтобы продемонстрировать, что проблемы:

using System;
using System.Windows.Forms;

namespace UIWriteOverhead
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int[] getNumbers(int upperLimit)
        {
            int[] ReturnValue = new int[upperLimit];

            for (int i = 0; i < ReturnValue.Length; i++)
                ReturnValue[i] = i;

            return ReturnValue;
        }

        void printWithBuffer(int[] Values)
        {
            textBox1.Text = "";
            string buffer = "";

            foreach (int Number in Values)
                buffer += Number.ToString() + Environment.NewLine;
            textBox1.Text = buffer;
        }

        void printDirectly(int[] Values){
            textBox1.Text = "";

            foreach (int Number in Values)
                textBox1.Text += Number.ToString() + Environment.NewLine;
        }

        private void btnPrintBuffer_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Generating Numbers");
            int[] temp = getNumbers(10000);
            MessageBox.Show("Printing with buffer");
            printWithBuffer(temp);
            MessageBox.Show("Printing done");
        }

        private void btnPrintDirect_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Generating Numbers");
            int[] temp = getNumbers(1000);
            MessageBox.Show("Printing directly");
            printDirectly(temp);
            MessageBox.Show("Printing done");
        }
    }
}

Как уже упоминал другой комментатор, вы, возможно, захотите перейти к какой-либо форме многозадачности. Действительно, мой первый опыт многозадачного обучения был проверкой Fibbonacci / Prime Number. Это хороший пример для изучения.

...