在C#中递归打印斐波那契字符串

7
能否不使用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]次;不确定如何在没有循环的情况下完成这个任务...

12个回答

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

3
公共静态方法Fibonacci,接收三个整数参数a、b和number。 { 输出a; 如果number大于1,则递归调用Fibonacci方法,传入参数为b、a+b和--number。 } - adityap

10
public static int Fibonatchi(int position) {

    if(position == 0) {
        return 1;
    }
    if(position == 1) {
        return 1;
    } else {
        return Fibonatchi(position - 2) + Fibonatchi(position - 1);
    }
}

1

我没有找到更接近的方法,最好的方式是将两个循环和递归结合起来。

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

    }

如果(number<0)则抛出新的ArgumentOutOfRangeException(); - Yuval Perelman

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

    }
}

如果您能解释一下您编写的代码,那将非常有帮助。 - aydow

0

使用一行代码:

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

0

使用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();
        }
    }

0

简单易懂的解决方案:

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

0

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


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

    }
}

希望这对您有所帮助。

2
那个「for」关键字看起来非常像循环。 - Jacob Krall
好的,那就不像递归。 - Dave Lawrence

0

这是一种通过将值返回到主函数来实现的方法。

public static void Main() {

    Console.WriteLine("Introduce the number");
    int num = Convert.ToInt32(Console.ReadLine());

    int num1 = 1, num2 = 1, counter = num-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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接