我做了Fibonacci系列方法;
public static int fibonacci(int n) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
但我需要在两个数字之间打印这个系列,所以我写了一些代码,如:
int q=0;
while(q<max){
if(fibonacci(q)<min){}
if(fibonacci(q)>max){break;}
if(fibonacci(q)<=max&&fibonacci(q)>=min)
System.out.print(fibonacci(q)+" ");
q++;
这个循环在main方法中。我需要在一个方法中执行此操作,我的意思是两个函数将使用相同的方法。
答案 0 :(得分:3)
如果N
或(5*N^2+4)
是完美的正方形,则数字(5*N^2-4)
是斐波那契数。我猜您可以使用此属性打印min
和max
之间的所有斐波纳契数。
例如,5
是斐波纳契数,5 * 5 * 5 - 4 = 121是完美的正方形。
for (int i = min; i <= max; i++) {
if (isPerfectSquare(5*i*i + 4) || isPerfectSquare(5*i*i - 4)) {
// i is fibonacci number
}
}
在上面的解决方案中,一旦获得前两个斐波那契数字,就可以跳过循环,并使用斐波纳契公式得到其余的数字。
答案 1 :(得分:2)
为什么不在第一个代码中用较低的一个替换1,用n替换n。它会打印两个数字之间的斐波那契数列
尝试以下
for(int i=1;i<=5;i++) {
int res=fibonacci(i,2);
System.out.print(" "+res);
}
public static int fibonacci(int n,int m) {
if (n == 0) {
return 0;
} else if (n == m || n==1) {
return 1;
} else {
return fibonacci((n - 1),m) + fibonacci((n - 2),m);
}
}
我在这里打印2&amp; 5
答案 2 :(得分:2)
所以这就是你想要的(这个功能没有优化,请看下一个):
public static int fibonacciBetweeen(int min, int max) {
//get the fibonacci number before the min and the one before that.
n = 0;
while(fibonacci(n) < min){
n++;
}
while(fibonacci(n) <= max){
System.out.print(fibonacci(n)+" ");
n++;
}
}
将它与您的功能一起使用,它正在工作但未经过优化,如果您需要,我会尽力优化它。
所以调用fibonacciBetweeen(34, 144);
会返回34 55 89 144
。
优化测试和工作,比前一个更少的时间
public static void fibonacciBetweeen(int min, int max) {
int n1 = 1, n2=1, aux=0;
while((aux=n1+n2) < min){
n1=n2;
n2=aux;
}
while( (aux=n1+n2) <= max){
System.out.print(aux+" ");
n1=n2;
n2=aux;
}
}
当max是一个非常大的数字(100000000)时,它比Rohit Jain的回答少700倍;
大数字测试:
fibonacciBetweeen(34, 2147483647);
<强>结果:强>
34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903
花了1毫秒