好的,所以我没有看到你想保留递归。
那么这个怎么样:
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) 在faculty(n-1) 之前被调用。由于要在faculty(n) 之前打印faculty(n-1) 的值,因此需要在返回值之前打印,如下所示:
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].
事实上,您可以采用这个迭代循环,然后再次使其成为递归循环,但它的结构与您原来的斐波那契函数不同。