【问题标题】:Fibonacci numbers [closed]斐波那契数[关闭]
【发布时间】:2014-01-28 01:42:14
【问题描述】:

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

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

【问题讨论】:

  • "计算部分出了什么问题?"提示:does it follow the definition?
  • 这是你的任务,所以你应该这样做。向您的教授寻求帮助
  • 有一篇 .Net Perl 文章应该有所帮助 -dotnetperls.com/fibonacci
  • 询问用户他们想要得到斐波那契的数字。 一个数字的斐波那契是从1到该数字相乘的所有数字的乘积5! = 5 * 4 * 3 * 2 * 1 = 120(其中!表示斐波那契)。
  • @user2901139 looks like Factorial .. 请查看我链接的两篇文章。

标签: c# fibonacci


【解决方案1】:

递归方法的扩展 - 使用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-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 来记住函数的先前值(本文也有介绍)。

【讨论】:

    【解决方案2】:

    你知道斐波那契数的定义吗?请查一下;它们与多项式 x² - 1 无关。问题的关键在于你把算法翻译成C♯。

    您会发现三种通用方法:

    1. for 循环的迭代。
    2. 递归。
    3. 使用求幂的直接公式。

    尝试所有三种方式。我建议您查看 Graham、Knuth 和 Patashnik 的教科书,具体数学。您还将了解一些历史。

    【讨论】:

      【解决方案3】:

      如果你想要的是第 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 不会达到最大值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-05
        相关资源
        最近更新 更多