Java 用递归法求斐波那契数列中的数

Java 用递归法求斐波那契数列中的数,java,fibonacci,Java,Fibonacci,基本上,我正在寻找写一个程序,将给我的序列,但到一定的数字。假设我想去第20个数字或者别的什么。我想知道如何递归地迭代它,以便它只需使用if()语句就可以找到序列中每个数字的值,直到该数字为止。我没有任何代码,因为我所知道的只是如何使用for循环,这不是我需要的方法 我至少知道这么多: if n = 1 || n = 0 return n; else return F(n-1) + F(n-2); 代码: 我已经试过了,还有很多其他的尝试,但我还是被难倒了。我知道它是这样的01

基本上,我正在寻找写一个程序,将给我的序列,但到一定的数字。假设我想去第20个数字或者别的什么。我想知道如何递归地迭代它,以便它只需使用
if()
语句就可以找到序列中每个数字的值,直到该数字为止。我没有任何代码,因为我所知道的只是如何使用
for
循环,这不是我需要的方法

我至少知道这么多:

if n = 1 || n = 0
   return n;
else 
    return F(n-1) + F(n-2);
代码:


我已经试过了,还有很多其他的尝试,但我还是被难倒了。我知道它是这样的
01123558132134…

让我写一个递归阶乘函数来帮助你:

阶乘法的定义如下:

 if n == 0 || n == 1 return 1; else return n * F(n - 1);
可以用Java编写为:

public int factorial(int n) { 
   if(n == 0 || n == 1) { 
       return 1;
   } else { 
       return n * factorial(n - 1);
   }
}

因此,我认为,根据您所知道的情况,对斐波那契序列进行调整和测试已经足够了。

您可能会感到惊讶,但您的代码基本上已经完成了。我的感觉是你还不适应递归

任何可以迭代执行的操作都可以递归执行。 可以这样想:一个循环(for、while、do-while)有一个迭代步骤和一个检查是否完整的条件。例如,如果我将从1到n的所有数字相加:

int sum = 0;
for(int i = 1; i <= n; i++) { // Condition to check completion
    sum += i;  // iterative step
}
把这个应用到你的斐波那契方法中,我想你会没事的。不,真的,用适当的参数将其封装在函数调用中,这样就可以了


进一步澄清:电话是如何扩大的? 回到求和法,假设我想对1到10之间的数字求和。电话是如何扩展的

迭代地 实际上,在调用堆栈上做的事情不多。它正在经历一个循环。然而,我们可以综合每一次发生的事情

int sum = 0;
for(int i = 1; i <= 10; i++) {
    sum += i;
}
到目前为止似乎是对的

我们每次只取一个元素,并将其添加到集体求和值中。本质上,1+2+3+4+5+6+7+8+9+10被分解为以下方式:

sum += 1 // 1 now
sum += 2 // 3 now
sum += 3 // 6 now
...
sum += 10 // 55 now
递归地,在收集值的方式上没有任何区别,但是它的方式略有不同

递归地 检查对此的调用:

public int sum(int i, int n) {
    return n == i ? n : i + sum(i+1, n); // ternary if-else statement, the exact same as the if-else in the above sum method.
}

1 + sum(2, 10)
1 + 2 + sum(3, 10)
1 + 2 + 3 + sum(4, 10)
1 + 2 + 3 + 4 + sum(5, 10)
1 + 2 + 3 + 4 + 5 + sum(6, 10)
1 + 2 + 3 + 4 + 5 + 6 + sum(7, 10)
1 + 2 + 3 + 4 + 5 + 6 + 7 + sum(8, 10)
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + sum(9, 10)
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + sum(10, 10)
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
55
它在递归调用中所做的工作与在串行调用中所做的工作基本相同。这个扩展有点滑稽,但一旦你习惯了,它就不会是一个挑战


从这里开始,我强烈鼓励你尝试一下。不要害怕实验;这里提供的信息足以让您开始学习。

是的,对不起,我在这里补充了这一点。我只是在学习递归,而不是一直使用for循环来循环我的东西。试着先编写一个递归乘法函数:
intmult(inta,intb)
。将
a
乘以
b
只使用
b
上的加法和
a
上的减法,我想你就可以尝试斐波那契序列了。@user1340054你的逻辑是正确的,你有没有尝试过把它固定在一个方法中?甚至不能开始,我知道如果(X你能给我解释一下这个乘法函数吗?所以基本上只要把我在顶部输入的内容转换成代码形式就可以了?我得到了6765,但没有其他数字。你可能需要在“选择”中添加一些
println
语句打印序列的位置。当我尝试放入println语句时,我只是得到一组随机数。在斐波那契序列中我会是什么?它会是它前面的数字,所以它会像n-1吗?我不太明白返回n+sum(I+1,n)@user1340054时发生了什么:
I+sum(I+1,n)
(对不起,输入错误)正在将i添加到下一个递归调用
sum()
。换句话说,我们正在迭代任何值i,并将其添加到任何值i+1。如果我使用i=10和n=12调用调用,调用链可能如下所示:
10+sum(11,12)
->
10+11+sum(12,12)
->
10+11+12
->
33
。那么,如果我在我的主课求和(10,20)中这样做,我会从10开始,然后加上它,直到我等于n?
Cycle #1: sum=1
Cycle #2: sum=3
Cycle #3: sum=6
Cycle #4: sum=10
Cycle #5: sum=15
Cycle #6: sum=21
Cycle #7: sum=28
Cycle #8: sum=36
Cycle #9: sum=45
Cycle #10: sum=55
Sum = 55
sum += 1 // 1 now
sum += 2 // 3 now
sum += 3 // 6 now
...
sum += 10 // 55 now
public int sum(int i, int n) {
    return n == i ? n : i + sum(i+1, n); // ternary if-else statement, the exact same as the if-else in the above sum method.
}

1 + sum(2, 10)
1 + 2 + sum(3, 10)
1 + 2 + 3 + sum(4, 10)
1 + 2 + 3 + 4 + sum(5, 10)
1 + 2 + 3 + 4 + 5 + sum(6, 10)
1 + 2 + 3 + 4 + 5 + 6 + sum(7, 10)
1 + 2 + 3 + 4 + 5 + 6 + 7 + sum(8, 10)
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + sum(9, 10)
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + sum(10, 10)
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
55