好的,所以我没有看到您希望保留递归。
那么这个怎么样:
public class fib {
static int fibonacci(int value, boolean printThis) {
int result;
if (value==0 || value==1) {
result = value;
if (printThis) {
System.out.print(result);
System.out.print(", ");
}
} else {
if (printThis) {
result = fibonacci(value-1, true)+fibonacci(value-2, false);
System.out.print(result);
System.out.print(", ");
} else {
result = fibonacci(value-1, false)+fibonacci(value-2, false);
}
}
return result;
}
public static void main(String []args) {
fibonacci(7, true);
System.out.println();
}
}
我看不出你可以不用布尔值printThis
来控制只打印由两个值的递归产生的树的一条路径。为了让这一点更清楚一点,看看你如何递归地为教员做到这一点。
递归向后调用计算,因此faculty(n)
称为 before of faculty(n-1)
。由于要打印faculty(n-1)
before的值faculty(n)
,因此需要在返回值之前打印,如下所示:
static int faculty(int v) {
int result;
if (v==0) {
result = 1;
} else {
result = v*faculty(v-1);
}
System.out.print(result);
System.out.print(", ");
return result;
}
这将为您提供升序的值。我希望你能原谅最后一个逗号,如果你想在没有布尔参数控制它的情况下摆脱它,你将需要定义一个附加函数。
所以你看到你可以为教师做没有布尔控制打印的事情。
但这是因为它faculty
不会跨越递归调用树,而只是一个调用序列。如前所述,我只看到如果您通过添加布尔函数有一整棵调用树,您可以控制打印。
那是你所追求的吗?
无论如何,这仍然是我的第一个答案(效率更高,并且会更快地为您提供相同的输出):
迭代地而不是递归地计算斐波那契数。
最简单的方法是使用数组 fib[]。初始化为 fib[0] = 0,fib[1] = 1。然后迭代 i = 2 到 n,其中 fib[i] = fib[i-1] + fib [i-2]。
调整它也很容易,因此您不需要完整的数组,而只需要两个变量来存储 fib[i-1]、fib[i-2]。
事实上,您可以采用这个迭代循环,然后再次使其成为递归循环,但它的结构与您原来的斐波那契函数不同。