我最近开始学习C#(学过其他语言),我正在尝试使用while循环创建一个生成fibonacci序列到'nth'项的函数,然后返回'nth'的值术语。 我目前的代码是:
void fibonacci(int n)
{
int[] terms = { 0, 1 };
int i = 2;
while (i<=n)
{
terms.Concat( terms[i-1] + terms[i-2] );
i += 1;
}
return terms[n];
}
我对C#的理解非常糟糕,因为visual studio告诉我我不能在int []中使用'Concat' - 我正在尝试使用新值附加数组。任何帮助都会很棒。
答案 0 :(得分:4)
C#中的数组是固定长度的。
如果您想使用可变长度集合,请使用强类型List<T>
代替Add
方法:
int fibonacci(int n)
{
var terms = new List<int>{ 0, 1 };
int i = 2;
while (i<=n)
{
terms.Add( terms[i-1] + terms[i-2] );
i += 1;
}
return terms[n];
}
答案 1 :(得分:1)
您无法附加到数组。在.Net中,数组具有恒定的大小,您无法在创建后调整它们的大小。
相反,您应该使用List<int>
及其Add()
method。
答案 2 :(得分:1)
您可以使用列表并将代码更改为:
int fibonacci(int n)
{
List<int> terms = new List<int> { 0, 1 };
int i = 2;
while (i<=n)
{
terms.Add(terms[i-1] + terms[i-2]);
i += 1;
}
return terms[n];
}
答案 3 :(得分:0)
您无法向数组添加项目,因为它具有固定长度。使用List<int>
代替数组
答案 4 :(得分:0)
不要将值附加到数组。数组具有静态大小,您无法在创建后调整它们的大小。 使用
List<int> and its Add() method instead of array.
这是您对斐波那契系列的解决方案。
int fibonacci(int n)
{
var terms = new List<int>{ 0, 1 };
int i = 2;
while (i<=n)
{
terms.Add( terms[i-1] + terms[i-2] );
i += 1;
}
return terms[n];
}
也可以这样做:
class FibonacciSeries
{
static void Main(string[] args)
{
Console.WriteLine("Enter a num till which you want fibonacci series : ");
int val = Convert.ToInt32(Console.ReadLine());
int num1, num2;
num1 = num2 = 1;
Console.WriteLine(num1);
if (val > num2)
{
while (num2 < val)
{
Console.WriteLine(num2);
num2 += num1;
num1 = num2 - num1;
}
}
Console.ReadLine();
}
}
这里的数组格式是解决方案
public int[] FibonacciSeriesArray(int num)
{
int[] arr = new int[num+1];
arr[0] = 0;
arr[1] = 1;
for (int startnum = 2; startnum <= num; startnum++)
{
arr[startnum] = arr[startnum - 1] + arr[startnum - 2];
}
return arr;
}
答案 5 :(得分:0)
我很惊讶没有人提到修复数组大小。
好吧,也许我错过了什么,但你可以做到:
int[] FibonacciArray(int n)
{
int[] F = new int[n+1];
F[0] = 0;
F[1] = 1;
for (int i = 2; i <= n; ++i)
{
F[i] = F[i - 1] + F[i - 2];
}
return F;
}
平均比使用列表的版本快2.5倍。
但通常没有免费午餐:缺点是你的内存消耗没有平滑:你需要预先支付你需要的所有内存。
答案 6 :(得分:0)
这是一种更有效的方法来寻找斐波那契数字。
public static IEnumerable<double> FibList(int n)
{
for (int i = 1; i <= n; i++)
{
yield return Math.Round(Fib(i));
}
}
public static double Fib(double n)
{
double golden = 1.61803398875;
return (n == 0 || n == 1) ? 1 : (Math.Pow(golden, n) - Math.Pow(-golden, -n))/Math.Sqrt(5);
}
答案 7 :(得分:0)
我会将其作为递归,而不是循环。
private static int fibonacci(int fib)
{
if (fib == 2 || fib == 1)
{
return 1;
}
else
{
return fibonacci(fib - 1) + fibonacci(fib - 2);
}
}