我今晚一直在玩一些代码,我编写了一个非常简单的算法,我认为这是一个非常好的解决方案,对于斐波那契递归和大数字。我想知道你们对它的看法,如果你对它做得更好有所贡献,请与我们分享......看看下面的代码
public class RecursiveFibonacci {
public void calculateFib(long first, long next, long counter, int n) {
if(counter == n) {
return;
}
counter++;
if(first == 0 && next == 0) {
System.out.println("0");
calculateFib(0, 1, counter, n);
return;
}
if(first == 0 && next == 1) {
System.out.println("1");
calculateFib(1, 0, counter, n);
return;
}
if(first == 1 && next == 0) {
System.out.println("1");
calculateFib(1, 1, counter, n);
return;
}
long result = first + next;
if(result > 1) {
System.out.println(result);
calculateFib(next, result, counter, n);
}
}
public RecursiveFibonacci() {
calculateFib(0, 0, 0, 9999999);
}
public static void main(String[] args) {
new RecursiveFibonacci();
}
}
答案 0 :(得分:1)
Fibonacci序列仅取决于前两个值,您的基本案例为F(0) = 1
和F(1) = 1
,一般为F(n) = F(n - 1) + F(n - 2)
。您需要做的就是在计算时记住这些。递归是解决斐波纳契数的一种不好的方法,因为值越大,你不必要地做出越多的调用。你很快就会耗尽堆栈空间。
答案 1 :(得分:1)
我认为递归的斐波纳契也具有非常高的计算复杂度,可能是O(n!),而迭代只是O(n):)
答案 2 :(得分:1)
计算第i个斐波那契的最佳方法不是通过递归。您可以使用以下公式:
phi是黄金比例。然而,Fibonacci数的问题与使用的方法无关,而与数字的位数无关。他们将难以为大数字写作。
答案 3 :(得分:0)
一个问题是,calculateFib()
不会返回任何计算结果。它只打印结果。因此,请更改代码,使其返回结果。
一旦有效,请尝试非递归变体,这在实践中更适合。
答案 4 :(得分:0)
因为F 9999999 有~2089876个数字,所以你想要使用approximation。另请考虑memoization。