【问题标题】:Print a string of fibonacci recursively in C#在 C# 中递归打印斐波那契字符串
【发布时间】:2012-04-07 09:31:34
【问题描述】:

可以不用while循环来完成吗?

static void Main(string[] args)
{
    Console.WriteLine("Please enter a number");
    int number = Convert.ToInt32(Console.ReadLine());
    Console.WriteLine(" #" + Fibonacci(number));
}

public static int Fibonacci(int number)
{
    if (number <= 1)
    {
        return 1;
    }
    else
    {
        return Fibonacci(number - 2) + Fibonacci(number - 1);
    }
}

我什至不能在基本案例的主体中添加Console.WriteLine,因为它被执行了 [number] 次;不知道如何在没有循环的情况下做到这一点......

【问题讨论】:

    标签: c# recursion fibonacci


    【解决方案1】:

    使用一行代码:

    public static int Fibonacci(int i)
    {
        return i <= 2 ? 1 : Fibonacci(i - 1) + Fibonacci(i - 2);
    }
    

    【讨论】:

      【解决方案2】:

      简单易行的解决方案:

      static void Main(string[] args)
      {
           int number;
      
           Console.WriteLine("enter number");
      
           number = int.Parse(Console.ReadLine());
      
           Console.WriteLine(Recursive(number));
      
           Console.ReadLine();
      }
      
      public static int Recursive(int number)
      {
          if (number <= 2)
          {
              return 1;
          }
          else
          {
              return Recursive(number - 1) + Recursive(number - 2);
          }
      }
      

      【讨论】:

        【解决方案3】:
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
        
        namespace ConsoleApplication1
        {
            class Program
            {
                static int Main(string[] args)
                {
        
                    int n, i = 0, c;
                    Console.WriteLine("Enter the number of terms:");
                    n = Convert.ToInt16(Console.ReadLine());
        
                    Console.WriteLine("Fibonacci series\n");
        
                    for (c = 1; c <= n; c++)
                    {
                        int result = FibonacciFunction(i);
                        Console.Write(result + " " );
                        i++;
                    }
                    Console.WriteLine();
                    return 0;
                }
        
                public static int FibonacciFunction(int n)
                {
                    if (n == 0)
                    {
                        return 0;
                    }
                    else if (n == 1)
                    {
                        return 1;
                    }
                    else
                    {
                        return (FibonacciFunction(n - 1) + FibonacciFunction(n - 2));
                    }
                }
        
            }
        }
        

        【讨论】:

        • 如果你能解释你写的一些代码会很有帮助
        【解决方案4】:

        我意识到这可能是一个老话题,但是我认为这个问题本质上是好的。

        使用 while 循环/或递归方式不是最佳方式,因为它需要 O(2^n) 次。更好的方法是使用内存中已经存在的内容,如下所示。这最多需要 O(n) 时间。

        干杯!

         static double fibDynamic(int n)
                {
                    double[] array = new double[n];
                    array[0] = array[1] = 1;
        
                    for(int i = 2; i < n; i++)
                    {
                        array[i] = array[i - 1] + array[i - 2];
                    }
                    return array[n-1];
                }
        

        【讨论】:

          【解决方案5】:
          public static class Golden
          {
              public static IEnumerable<long> Fibonacci()
              {
                  var a = 0L;
                  var b = 1L;
                  var s = 0L;
                  yield return a;
                  while (a < long.MaxValue - b)
                  {
                      yield return b;
                      s = a + b;
                      a = b;
                      b = s;
                  }
              }
          
              public static IEnumerable<long> FibonacciR()
              {
                  IEnumerable<long> Fibo(long a, long b)
                  {
                      yield return a;
                      if (a < long.MaxValue - b)
                      {
                          foreach (var v in Fibo(b, a + b))
                          {
                              yield return v;
                          }
                      }
                  }
                  return Fibo(0, 1);
              }
          }
          

          【讨论】:

            【解决方案6】:

            这是一种通过将值返回到 main 中的方法。

            公共静态无效 Main() {

                Console.WriteLine("Introduce the number");
                int num = Convert.ToInt32(Console.ReadLine());
            
                int num1 = 1, num2 = 1, counter = num-2; 
            

            //取出2个来匹配列表,因为前2个数字不计入函数中。

                Console.WriteLine(Fibo(num1, num2, counter));
            }
            
            public static int Fibo(int num1, int num2, int counter)    {
            
                int temp = num1;
            
                if (counter <= 0)
                    return num2;
                else
                    return Fibo(num1 = num2, num2 += temp, counter-1);
            }
            

            【讨论】:

              【解决方案7】:

              使用 LINQ

                 public static void fibSeriesEx3()
                  {
                      List<int> lst = new List<int> { 0, 1 };
                      for (int i = 0; i <= 10; i++)
                      {
                          int num = lst.Skip(i).Sum();
                          lst.Add(num);
              
                          foreach (int number in lst)
                              Console.Write(number + " ");
                          Console.WriteLine();
                      }
                  }
              

              【讨论】:

                【解决方案8】:
                public static int Fibonatchi(int position) {
                
                    if(position == 0) {
                        return 1;
                    }
                    if(position == 1) {
                        return 1;
                    } else {
                        return Fibonatchi(position - 2) + Fibonatchi(position - 1);
                    }
                }
                

                【讨论】:

                  【解决方案9】:

                  以这种方式使用递归是一个非常糟糕的主意。它会很快导致内存问题。我知道你想避免使用 while/for 循环,但数组确实是最好的方法。

                  【讨论】:

                    【解决方案10】:
                    namespace Algorithms
                    {
                        class Program
                        {
                            static void Main(string[] args)
                            {
                                string fibResult = "";
                                fibResult =  FibCal(10);
                                Console.WriteLine(fibResult);
                                Console.ReadLine();
                            }
                    
                            public static string FibCal(int n)
                            {
                                string series = "";
                                int k, f1, f2 , f = 0;
                                f1 = f2 = 1;
                                if (n < 2) 
                                    return n.ToString();
                                else
                                    for (k = 0; k < n; k++)
                                    {
                                        f = f1 + f2;
                                        f2 = f1;
                                        f1 = f;
                                        series += f.ToString() + ",";
                                    }
                    
                                return series;
                            }
                    
                        }
                    }
                    

                    希望对你有帮助

                    【讨论】:

                    • for 关键字看起来很像一个循环。
                    • 嗯,这不像递归
                    【解决方案11】:
                    static void Main(string[] args)
                    {
                        Console.WriteLine("Please enter a number");
                        int number = Convert.ToInt32(Console.ReadLine());
                        Fibonacci(0, 1, 1, number);
                    }   
                    
                    public static void Fibonacci(int a, int b, int counter, int number)
                    {
                        Console.WriteLine(a);
                        if (counter < number) Fibonacci(b, a+b, counter+1, number);
                    }
                    

                    【讨论】:

                    • public static void Fibonacci(int a, int b, int number) { Console.WriteLine(a); if (number &gt; 1) Fibonacci(b, a+b, --number); }
                    【解决方案12】:

                    我没有找到最接近的方法是结合两个循环+递归

                        static void Main(string[] args)
                        { 
                            Console.WriteLine("Please enter a number");
                                  int number = Convert.ToInt32(Console.ReadLine());
                            for(int counter=0;counter<number;counter++)      
                            Console.WriteLine(" \n" + Fibonacci(counter) );
                    
                        }
                    
                        public static int Fibonacci(int number)
                        {
                    
                            if (number == 0)
                                return 0;
                            else if(number ==1)
                              return 1;
                            else
                            {
                             return Fibonacci(number - 2) + Fibonacci(number - 1);
                            }
                    
                        }
                    

                    【讨论】:

                    • if(number
                    猜你喜欢
                    • 2012-02-15
                    • 2013-04-11
                    • 2010-12-03
                    • 2023-01-18
                    • 2015-02-09
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-03-13
                    相关资源
                    最近更新 更多