题目要求为求输入整数n,返回斐波那契数列的第n个数;
斐波那契数列:0 1 1 2 3 5 8 13 21 34.。。。
即第一项为0,第二项为1,以后每项为钱两项之和
public int Fibonacci(int n)
{
if (n <= 0) return -1;
if (n == 1) return 0;
if (n == 2) return 1;
int[] nums = new int[n];
nums[0] = 0;
nums[1] = 1;
for (int i = 2; i < n; i++)
{
nums[i] = nums[i - 1] + nums[i - 2];
}
return nums[n - 1];
}
之后又看了官方的答案,瞬间感觉自己好low。。。
下面是官方给出的代码
public int Fibonacci(int n)
{
if (n <= 0) return -1;
int a = 0;
int b = 1;
for (int i = 0; i < n - 1; i++)
{
int c = a + b;
a = b;
b = c;
}
return a;
}
2018.5.4补充
今天又遇到求斐波那契数列的算法题,是利用矩阵求解,题目如下:
An alternative formula for the Fibonacci sequence is:
利用题目给的公式求解斐波那契数列的第n项
先定义2X2矩阵及矩阵乘法,和矩阵幂运算(利用二分法求幂运算,这也是自己没想到的,如果是我首先想到的应该是循环求幂,)
public class Matrix
{
public long a, b, c, d;
public Matrix(long a, long b, long c, long d)
{
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
public Matrix() { }
public static Matrix MatrixMul(Matrix A, Matrix B)
{
Matrix m = new Matrix
{
a = A.a * B.a + A.b * B.c,
b = A.a * B.b + A.b * B.d,
c = A.c * B.a + A.d * B.c,
d = A.c * B.b + A.d * B.d
};
return m;
}
//二分法求矩阵幂
public static Matrix MatrixPow(int n)
{
Matrix m = new Matrix();
if (n == 1)
{
m = new Matrix(1, 1, 1, 0);
}
else if (n % 2 == 0)
{
m = MatrixPow(n / 2);
m = MatrixMul(m, m);
}
else if (n % 2 == 1)
{
m = MatrixPow((n - 1) / 2);
m = MatrixMul(m, m);
m = MatrixMul(m, new Matrix(1, 1, 1, 0));
}
return m;
}
}
再实现求解斐波那契数列第n项:
public string Fibonacci(int n)
{
if (n == 0) return "0";
if (n == 1) return "1";
Matrix m = Matrix.MatrixPow(n);
string s = m.b.ToString();
return s;
}