基本上,我正在寻找一个程序,它会给我序列但最多一定数量。所以,假设我想要达到第20个数字或者其他东西。我想知道如何递归地迭代它,以便它只需使用if()
语句就可以找到序列中每个数字的值,直到该数字。我没有任何代码,因为我所知道的是如何使用for
循环,这不是我需要的方法。
我至少知道这一点:
if n = 1 || n = 0
return n;
else
return F(n-1) + F(n-2);
代码:
class Fibonocci {
public static int factorial(int i,int n) {
System.out.println(i);
if(i==n || n==0 || n==1) { // base case; when i = n, we're done.
return n;
} else {
return i + 1 + factorial(i+2,n); // iterative case; we're still adding values up.
}
}
public static void main(String[] args)
{
Fibonocci test= new Fibonocci();
System.out.println( test.factorial(0,10) );
}
}
我一直在尝试和其他一些尝试,但我仍然难过。我知道它是0 1 1 2 3 5 8 13 21 34...
答案 0 :(得分:5)
你会感到惊讶,但是你的代码几乎就在那里。我的感觉是你对递归感到不舒服。
可以这样想:循环(for,while,do-while)有一个迭代步骤,以及检查它是否完整的条件。例如,如果我将所有数字从1添加到n:
int sum = 0;
for(int i = 1; i <= n; i++) { // Condition to check completion
sum += i; // iterative step
}
要将此转换为递归函数,我需要完成条件 - 称为基本情况 - 和迭代步骤,或迭代情况。对于求和,我的基本情况可能是i==n
。
public int sum(int i, int n) {
if(i == n) { // base case; when i = n, we're done.
return n;
} else {
return i + sum(i+1, n); // iterative case; we're still adding values up.
}
}
将此应用于您的Fibonacci方法,我认为您会很好。不,真的,用适当的参数将它包装在一个函数调用中,你就可以了。
回到求和方法,让我们说我要将1到10之间的数字相加。如何扩展呼叫?
没什么可做的&#39;在电话堆栈上,真的。它正在经历一个循环。但是,我们可以综合每次发生的事情。
int sum = 0;
for(int i = 1; i <= 10; i++) {
sum += i;
}
通过循环看起来如何:
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
到目前为止似乎是正确的。
我们每次只是将一个元素添加到集合求和值中。从本质上讲,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
它在递归调用中基本上与在串行调用中一样。扩展有点搞笑,但是一旦你习惯了它,它就不会成为一种挑战。
从这里开始,我强烈建议您尝试一下。不要害怕尝试;这里提供的信息足以让您入门。
答案 1 :(得分:2)
让我通过编写递归因子函数来帮助你:
析因方法定义为:
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);
}
}
所以我认为,根据你所知,你可以根据斐波那契的顺序进行调整和测试。