所以我有这个问题,我必须从用户计算任何给定数字的斐波纳契数。我不知道如何做实际的计算部分,但其他一切都有效。这是我的代码。有人可以帮我计算部分吗?
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 :(得分: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♯。
您可以找到三种常用方法:
尝试三种方式。我建议你看看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不会最大化。