📅  最后修改于: 2023-12-03 15:42:22.363000             🧑  作者: Mango
这是一道来自门|门CS 2008年的编程问题,需要求出一个指定数列中第 n 项的值。本题可以通过递归算法或动态规划算法解决。
有一条数列,它的前两项分别为 1 和 2,后面的每一项都是其前两项之和。例如,这条数列的前 10 项分别是:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89
请编写一个程序,能够输入一个整数 n(0<n<=10000),并输出数列中的第 n 项的值。
递归算法是一种从问题的结果出发递归求解的算法。本题可以使用递归算法来求解,递归函数可以定义如下:
public int fibonacci(int n) {
if (n == 1 || n == 2) {
return n - 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
其中,n 表示要求的数列中的项数,函数返回值为对应的项值。当 n 为 1 或 2 时,直接返回 0 或 1,否则递归调用自身进行求解。
该算法的时间复杂度为指数级别,因此不适合用于大规模数据的求解。
动态规划算法是一种利用已知信息求解未知问题的算法。本题可以使用动态规划算法来求解,算法思路如下:
代码实现如下:
public int fibonacci(int n) {
if (n == 1) {
return 1;
} else {
int[] f = new int[n+1];
f[1] = 1;
f[2] = 2;
for (int i = 3; i <= n; i++) {
f[i] = f[i-1] + f[i-2];
}
return f[n];
}
}
该算法的时间复杂度为 O(n),可以满足大规模数据的求解需求。
以上是本题的两种解法,程序员可以根据自己的需求选择相应的算法进行求解。