Fibonacci数列的计算

原创 2006年05月18日 23:30:00

msdn中在演练BackgroundWorker的时候,使用递归计算Fibonacci数列的f(n)。

        private void startAsyncButton_Click(object sender, EventArgs e)
        {
            //清空
            resultLabel.Text = String.Empty;
            //设置状态

        private int numberToCompute = 0;
        private int highestPercentageReached = 0;

            this.numericUpDown1.Enabled = true;//numericUpDown1为读入需要计算的值
            this.startAsyncButton.Enabled = false;//开始计算按钮
            this.cancelAsyncButton.Enabled = true;//取消按钮

            numberToCompute =(int) numericUpDown1.Value;
            // Reset the variable for percentage tracking.
            highestPercentageReached = 0;

            // Start the asynchronous operation.
            backgroundWorker1.RunWorkerAsync(numberToCompute);

        }

        private void cancelAsyncButton_Click(object sender, EventArgs e)
        {
            // Cancel the asynchronous operation.
            this.backgroundWorker1.CancelAsync();

            // Disable the Cancel button.
            this.cancelAsyncButton.Enabled = false;
            this.startAsyncButton.Enabled = true; ;

        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            // Get the BackgroundWorker that raised this event.
            BackgroundWorker worker = sender as BackgroundWorker;
            e.Result = ComputeFibonacci((int)e.Argument, worker, e);

        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {

           this.progressBar1.Value = e.ProgressPercentage;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // First, handle the case where an exception was thrown.
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message);
            }
            else if (e.Cancelled)
            {
 
                resultLabel.Text = "Canceled";
            }
            else
            {
                // Finally, handle the case where the operation
                // succeeded.
                resultLabel.Text = e.Result.ToString();
            }
            this.numericUpDown1.Enabled = true;
            startAsyncButton.Enabled = true;
            cancelAsyncButton.Enabled = false;

        }

        // This is the method that does the actual work. For this
        // example, it computes a Fibonacci number and
        // reports progress as it does its work.
        long ComputeFibonacci(int n, BackgroundWorker worker, DoWorkEventArgs e)
        {
            // The parameter n must be >= 0 and <= 91.
            // Fib(n), with n > 91, overflows a long.
            if ((n < 0) || (n > 91))
            {
                throw new ArgumentException(
                    "value must be >= 0 and <= 91", "n");
            }

            long result = 0;

            if (worker.CancellationPending)
            {
                e.Cancel = true;
            }
            else
            {
                if (n < 2)
                {
                    result = 1;
                }
                else
                {
                    result = ComputeFibonacci(n - 1, worker, e) +
                             ComputeFibonacci(n - 2, worker, e);
                }

                // Report progress as a percentage of the total task.
                int percentComplete =
                    (int)((float)n / (float)numberToCompute * 100);
                if (percentComplete > highestPercentageReached)
                {
                    highestPercentageReached = percentComplete;
                    worker.ReportProgress(percentComplete);
                }
            }

            return result;
        }

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//当然这是为了演示BackgroundWorker,其实Fibonacci数列可以如下这样计算:

        private void FibonacciForm_Load(object sender, EventArgs e)
        {
            //textBox1.Text = "斐波纳契数列(一种整数数列, 其中每数等于前面两数之和)。"
            //              + "该数列为 1、1、2、3、5、8、........"
            //               + "如果你想知道该数列的第n个数,请在下面输入n-1";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            numberToCompute = (int)numericUpDown1.Value;
            double tem = Fibonacci_2(numberToCompute);
            label1.Text = tem.ToString();
        }
        private double Fibonacci_2(int n)
        {
            if (n < 2)
                return 1;
            else
              return (Math.Pow((Math.Sqrt(5) + 1)/ 2.0, n)  - Math.Pow((1 - Math.Sqrt(5))/ 2.0, n) ) / Math.Sqrt(5);
        }

Fibonacci数列第N项的两种计算方法比较

一、斐波那契数列(Fibonacci Sequence)的定义        斐波那契数列的发明者,是意大利数学家列昂纳多·斐波那契(Leonardo Fibonacci,生于公元1170年,卒...

Fibonacci数计算中的两个思维盲点及其扩展数列的通用高效解法

转自:http://www.cppblog.com/flyinghearts/archive/2012/02/28/166717.html ㈠ Fibonacci数 刚接触Fibonacc...

Fibonacci数列的计算和转换

描述:  介绍: 一、Fibonacci数列: 1,1,2,3,5,8,13,15,28,… 它们有这样的规律:第1和第2的数字都是1,第3个数字是前2个数字之和,第4个数...

基于Cache的Fibonacci数列的计算

这个数列在编写程序的过程中,应该被无数次提起,今天再次提起,作为动态规划的一个引入。 动态规划被人总结为: 递推 + Cache 而使用Cache方式的Fib数列计算也是很酷的。代码非常简洁,但...

Fibonacci 数列及其计算方法

Fibonacci 数列及其计算方法斐波那契数列(Fibonacci sequence),又称黄金分割数列,这个数列最早是由印度数学家提出来的。不过更多的人学习到这个数列是因为意大利数学家列昂纳多·斐...

使用并行的方法计算斐波那契数列 (Fibonacci)

今天给公司同事做关于并行编程的内部培训,大家对是否能用并行的方法计算斐波那契数列(Fibonacci),以及使用并行的方法能否提高其性能进行了一些讨论。 我的结论是: 1.可以使用并行的方法计算。...

UVA 10518 How Many Calls(求计算Fibonacci数列第n项时递归调用次数)

题目链接: UVA 10518 How Many Calls 分析: 根据公式 Cnt[i]=Cnt[i−1]+Cnt[i−2]+1Cnt[i]=Cnt[i-1]+Cnt[i-2]+1,且Cn...
  • Ramay7
  • Ramay7
  • 2016年03月20日 10:58
  • 316

计算fibonacci数列logn的算法

计算fibonacci数列通常有两种方法,非常符合fibonacci数列公式表达的方法就是使用递归,当x = 1或x = 2时,fab(x) = 1; x > 2时,fac(x) = fac(x - ...

[华为机试练习题]52.Fibonacci数列的计算和转换

题目描述: 介绍: 一、Fibonacci数列: 1,1,2,3,5,8,13,15,28,… 它们有这样的规律:第1和第2的数字都是1,第3个数字是前2个数字之和,第4个数字是第2,第3个数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Fibonacci数列的计算
举报原因:
原因补充:

(最多只允许输入30个字)