import static java.lang.System.*;
class NA_False {
public static void main(String[] args) {
int fibonacci = fibo(5);
System.out.println(fibonacci);
}
static int fibo(int n) {
if (n == 0 || n == 1) {
out.println(n);
return n;
}
else {
int n1 = fibo(n - 1);
int n2 = fibo(n - 2);
out.println((n1 + n2) + "=" + n1 + "+" + n2);
return n1 + n2;
}
}
}
我想说明我们如何得到每个斐波纳契数,但我得到了太多不必要的步骤。
答案 0 :(得分:1)
使用递归非常简单 -
public static int fibo(int n){
if(n == 1 || n == 2){
return 1;
}
return fibo(n-1) + fibo(n -2);
}
现在从您的主要方法中,您可以将其称为打印 -
int fibonacci = fibo(5);
System.out.println(fibonacci);
更新当您需要一步一步的结果时,您可以使用以下解决方案使用for循环 -
public class FiboTest{
public static void main(String[] args){
int term = fibo(17);
//1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
System.out.println();
System.out.println("Result: " +term);
}
public static int fibo(int n){
int first = 1;
int second = 1;
int third = 0;
for(int i=1; i<(n-1); i++){
third = first+second;
System.out.println(first +" + "+ second +" = "+ third);
//update first and second terms
first = second;
second = third;
}
return third;
}
}
答案 1 :(得分:0)
问题在于这可能是计算斐波那契数的最差方法。原因是,为什么你多次看到大多数加法是因为你多次对它们进行计算。
通常你会从第1和第2个纤维开始,然后按顺序前进,直到达到所需的数字。
答案 2 :(得分:0)
当您递归计算fibo(n)
时,它会为每个调用打开两个分支。例如,如果我们执行fibo(5)
,则确实如此:
fibo(5) = fibo(4) + fibo(3)
然后它需要计算fibo(4)
,所以它确实:
fibo(4) = fibo(3) + fibo(2)
如您所见,fibo(3)
被调用两次。这就是为什么你会两次打印2=1+1
的原因。对于fibo(2)
,fibo(1)
等
如果您只打印一次总和,则需要存储已计算的值或使用其他方法计算斐波纳契数。
您可以使用for
循环迭代地执行此操作:
static int fibo(int n) {
int p1 = 0;
int p2 = 1;
for (int i = 0; i < n; i++) {
int tmp = p1 + p2;
System.out.println(tmp + "=" + p1 + "+" + p2);
p1 = p2;
p2 = tmp;
}
return p2;
}
请注意,这将以1 1 2 3...
的形式返回序列。如果您需要表单0 1 1 2 3...
,则需要将return p2
替换为return p1
。