Java 这个方法是递归还是迭代?

Java 这个方法是递归还是迭代?,java,recursion,iteration,Java,Recursion,Iteration,我一直在努力理解递归,因为它适用于一些例子,如斐波那契和下面的加法序列 int AdditiveSequence(int n, int t0, int t1){ if(n == 0) return t0; if(n == 1) return t1; return AdditiveSequence(n - 1, t1, t0 + t1); } 我考虑了如何应用它,并尝试了以下方法: static final double PERCENT = 0.005; double

我一直在努力理解递归,因为它适用于一些例子,如斐波那契和下面的加法序列

int AdditiveSequence(int n, int t0, int t1){
    if(n == 0) return t0;
    if(n == 1) return t1;
    return AdditiveSequence(n - 1, t1, t0 + t1);
}
我考虑了如何应用它,并尝试了以下方法:

static final double PERCENT = 0.005;

double Depreciation(int month, double currentValue){
    if(month == 0)return currentValue;
    return Depreciation(month - 1, currentValue -= currentValue * PERCENT);
}
但这似乎不是一个递归,更像是一个迭代,因为当我在Eclipse调试屏幕中查看时,它在month==0时退出,并正确返回迭代的
currentValue

对于阶乘(n)方法:

它似乎将计算推迟到到达基本情况,然后返回堆栈,直到到达结果


有谁能帮我确定我用上述折旧方法做了什么,以及它实际上是递归还是迭代

这实际上被称为尾部递归,这意味着当你到达递归的末尾时,你就得到了结果。这种类型的递归很容易转换为迭代代码,并且通常由编译器执行

static final double PERCENT = 0.005;

double Depreciation(int month, double currentValue){
    if(month == 0)return currentValue;
    return Depreciation(month - 1, currentValue -= currentValue * PERCENT);
}

在您的情况下,当前值一直在累积,这就是它符合尾部递归配置文件的原因。

我认为AdditiveSequence也必须称为尾部递归,因为它在完成时也存在,即(n==1)返回t1;因为这满足了计算…

我认为这是递归,因为函数引用自身,所以它就像一个链,直到条件成功,所有链都返回。正如@solvator所说,它肯定是一个递归,因为它调用自身来计算返回值。请注意,您应该使用
currentValue-(currentValue*PERCENT)
因为在当前递归中修改currentValue没有意义。这是源代码级别的递归。现在,JVM可以做什么优化来使递归“更快”?这可以解释调试输出。是的
AdditiveSequence
也是尾部递归()
static final double PERCENT = 0.005;

double Depreciation(int month, double currentValue){
    if(month == 0)return currentValue;
    return Depreciation(month - 1, currentValue -= currentValue * PERCENT);
}