2014-01-28 76 views
-2

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

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); 
    } 
    } 
} 
+0

“计算部分出了什么问题?”提示:[它是否遵循定义?](http://en.wikipedia.org/wiki/Fibonacci_number) – user2864740

+0

这是你的任务,所以你应该这样做。询问你的教授关于帮助 – zerkms

+0

有一个.Net Perl文章应该帮助--http://www.dotnetperls.com/fibonacci – X3074861X

回答

0

你知道斐波纳契数的定义吗?请看看他们;它们与多项式x² - 1无关。问题的关键在于您将算法转换为C♯。

有你会发现三个基本途径:

  1. 迭代通过一个for循环。
  2. 递归。使用指数的直接公式。

试试这三种方法。我建议你看看Graham,Knuth和Patashnik的教科书,具体数学。你也会学到一些历史。

2

扩展递归的方法 - 使用anonymous recursion(它使用斐波纳契如实施例递归调用的):

定义递归函数: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组合子来构造递归函数:

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来记住该函数的以前的值(本文也包含该值)。

0

如果你想要的是第n个斐波纳契数这样的事情应该工作:

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

nthfib将等于16 Fibonacci数,610

由于Fibonacci序列变得非常大,而迅速,您可能需要在n上设置限制,以便nthfb不会超出范围。