斐波纳契数

时间:2014-01-28 01:42:15

标签: c# fibonacci

所以我有这个问题,我必须从用户计算任何给定数字的斐波纳契数。我不知道如何做实际的计算部分,但其他一切都有效。这是我的代码。有人可以帮我计算部分吗?

using System;

namespace Assignment
{
  class MainClass
  {
     public static void Main (string[] args)
     {
       int sum = 0;
       Console.WriteLine("Fibonacci Number: ");
       String fib = Console.ReadLine ();
       double result = Convert.ToDouble (fib);
       for(int i = 0; i <= result; i++)
       {
         sum = i * i - 1;
       }
       Console.WriteLine ("!" + result + " = " + sum);
     }
  }
}

3 个答案:

答案 0 :(得分:2)

递归方法的扩展 - 使用anonymous recursion(使用Fibonacci作为递归调用的示例):

定义递归函数:f(n+1) = f(n) + f(n-1);

从文章中获取Y-Combinator的定义:

delegate Func<A,R> Recursive<A,R>(Recursive<A,R> r);
static Func<A, R> Y<A, R>(Func<Func<A, R>, Func<A, R>> f)
{
  Recursive<A, R> rec = r => a => f(r(r))(a);
  return rec(rec);
} 

现在使用Y-combinator构造递归函数:

Func<int,int> fib = Y<int,int>(f => n => n > 1 ? f(n - 1) + f(n - 2) : n);

准备打电话:

var fibOfSmallNumber = fib(4);

现在,对于较大的值,您需要BigInteger

Func<BigInteger,BigInteger> fibForBigNumbers = 
    Y<BigInteger,BigInteger>(f => n => n > 1 ? f(n - 1) + f(n - 2) : n);
var fibOfBigNumber = fib(4);

不要期望它在短时间内返回值 - 默认递归实现非常慢。相反,您应该应用Memoization来记住函数的先前值(文章中也包含这些值)。

答案 1 :(得分:0)

您知道Fibonacci数字的定义吗?请仔细查看;它们与多项式x² - 1 无关。问题的关键在于您将算法转换为C♯。

您可以找到三种常用方法:

  1. 通过for循环迭代。
  2. 递归。
  3. 使用取幂的直接公式。
  4. 尝试三种方式。我建议你看看Graham,Knuth和Patashnik的教科书,具体数学。你也将学习一些历史。

答案 2 :(得分:0)

如果您想要的是第n个斐波那契数字,那么这应该有效:

const double goldenratio = 1.6180339887;
int n = 16;
int nthfib = Math.Round(Math.Pow(goldenratio, n - 1) / Math.Sqrt(5));

nthfib将等于第16个斐波纳契数,610。

由于斐波纳契序列变得非常快,您可能需要在n上设置限制,以便nthfib不会最大化。