class FibR
{
int c=0;
void fib(int i,int j,int n){
if(c==n) return;
System.out.print(i+" "+j+" ");
int t=j;
i=i+j;
j=i+t;
c++;
fib(i,j,n);
}
public static void main(String[] args) {
FibR f=new FibR();
f.fib(0,1,5);
}
}
输出结果为:
0 1 1 2 3 5 8 13 21 34
我只需要打印0 1 1 2 3 ,i.e
,5个术语
if语句中的条件需要哪些更正?尝试c+=2
而不是c++
,但代码进入无限循环。
提前致谢
答案 0 :(得分:6)
在每次fib
来电中,您都会打印两个原始数字:System.out.print(i+" "+j+" ");
以下是一个更简单的版本:
public class FibR {
void fib(int i, int j, int n) {
if (n == 0) return;
System.out.println(i);
fib(j, i + j, n - 1);
}
public static void main(String[] args) {
FibR f = new FibR();
f.fib(0, 1, 5);
}
}
每次拨打fib
时,都会传递最新的两个号码(i
和j
)以及剩余的号码(n
)。
答案 1 :(得分:4)
要使用c += 2
,您还应在if-statement
中包含相等内容。
class FibR
{
int c = 0 ;
void fib(int i, int j, int n){
if (c >= n) return;
System.out.print(i+" " + j +" ");
int t = j;
i += j;
j = i + t;
c += 2;
fib(i, j, n);
}
public static void main(String[] args) {
FibR f = new FibR();
f.fib(0, 1, 5);
System.out.println();
}
}
由于您不能只获得5个字符,因此输出将为:
0 1 1 2 3 5
答案 2 :(得分:3)
当您同时打印i
和j
时,您无法打印5个字词。它可以是4或6。
现在,就无限循环而言,如果您要将c++
更改为c+=2
,则需要将if (c == n)
更改为if (c >= n)
为c
第二次迭代后将大于5。
答案 3 :(得分:2)
将计数器减少到3,如果你的迭代达到计数器-1,只需打印i并删除j
class FibR {
int c = 0;
void fib(int i, int j, int n) {
if (c == n) return;
if (c < n - 1)
System.out.print(i + " " + j + " ");
else
System.out.print(i);//c == n-1 => just print i
int t = j;i = i + j;j = i + t;c++;fib(i, j, n);
}
public static void main(String[] args) {
FibR f = new FibR();
f.fib(0, 1, 3);//reduce to 3
}
}
答案 4 :(得分:0)
为什么要这样写你的功能?由于它是递归,因此您的函数应该只接受一个参数,即您想要的元素数量。
似乎你使用3个参数使它变得复杂。
答案 5 :(得分:0)
在递归函数中,您最好不要保存/取决于某些外部状态/文件。在您的示例代码中,它是因为您在每次调用中打印两个术语,因此您永远不会让它打印奇数。