在 Java 中如何计算递归函数?



我是Java新手,下面的代码计算a^b,我已经在计算机上编译了它,它工作正常。但我不明白它是如何工作的?java编译器如何计算a * power(a, b - 1)任何人都可以向我解释这段代码吗?

int power(int a, int b) {
if (b < 0) {
return 0;
} else if (b == 0) {
return 1;
} else {
return a * power(a, b - 1);
}
}

你的函数是递归的。通过示例演示它的工作原理可能是最简单的。

假设您要计算 2^4。 因此,您称power(2, 4);

这是评估它的方式(请注意,您弄错了基本情况):

power(2, 4) // b > 0, so it expands.
2 * power(2, 3)
2 * (2 * power(2, 2))
2 * (2 * (2 * power(2, 1)))
2 * (2 * (2 * (2 * power(2, 0)))) // Now, b == 0, so it evaluates to -1 
2 * (2 * (2 * (2 * -1)))
2 * (2 * (2 * -2))
2 * (2 * -4)
2 * -8
-16

所述的代码给出了错误的答案;第 5 行应读作return 1;,而不是return -1;

Java 通过调用power方法计算对该方法的调用。这里没有什么不同,它可能只是让您有点困惑,因为我们是从幂方法中调用 power 方法的。这在Java中很好。

因此,让我们尝试power(3, 4)为例。

Java 将首先检查该 4 是否低于 0。它不是,所以跳过它。那么如果它是 0.它不是,所以跳过它。然后它将返回表达式的结果(填写变量值):return 3 * power(3, 4 - 1).要计算这一点,必须首先评估power(3, 3)

所以爪哇...做到了。它记得它在power(3, 4)上完成了一半的工作(它在"堆栈上"执行此操作),现在开始计算power(3, 3)。答案是评估return 3 * power(3, 2).因此,java 会记住为power(3, 3)完成的一半工作,并对其进行计算。答案是return 3 * power(3,1)的结果。你猜对了,记住我们的工作并再次调用权力:return 3 * power(3, 0)但最终我们出来了:方法调用power(3, 0)由第二个"if"解析,因此,return 1;发生。power(3, 0)成功完成!现在power(3, 1)可以完成,然后power(3, 2)可以完成,一直向上,返回 81。

这是递归。 那是程序调用自己的时候。 如果您如图所示放置打印语句,您可以看到它是如何工作的。

static int power(int a, int b) {
if (b < 0) {
return 0;
}
else if (b == 0) {
return 1;
}
else {
System.out.println("Before: a = " + a + ", b = " + b);
int res = a * power(a, b - 1);
System.out.println(
"After: res = " + res + ", a = " + a + ", b = " + b);
return res;
}
}

每次通过时,值都会改变,如调用电源所示,b 减少 1。 然后当b == 0时,程序开始返回,从调用堆栈"retrieving"每个值来执行计算。

它被称为递归函数,这是一个调用自己的函数。为了确保它不会无限调用自身(并导致堆栈溢出;)),请确保至少有一个退出条件。

退出条件是一个不调用函数本身的返回。

举个例子:3^4.事实上,3^4(3*3)*(4-1)(3*3*3)*(4-2)(3*3*3*3)*(4-3)相同。这正是你对递归所做的!

在您的情况下,回避调用是

return a * power(a, b - 1);

(这正是我上面显示的)

并且您有2个退出条件:

if (b < 0) {
return 0;
} else if (b == 0) {
return -1;
} 

此代码适用于递归。每个递归调用都会推送一个新的堆栈帧,然后在返回时弹出它。

您需要检查上述代码中的基本情况。因此,当 b==0 时,它应该返回 1。

step 1          : call Power(2,2)
Step 2          : go to else part a=2 and call again power(2,1)
step 3          : goto else part a=2 and call again power(2,0)
step 4          : goto else if part return -1 and go back to step 3
step 5(step 3)  : calculate 2*-1 = -2;go back to step 2
step 6(step 2)  : calculate 2*-2=-4 and finally return -4 

这里步骤2到4调用相同的方法,直到匹配特定条件。它被称为递归

您的函数有一些错误,因此它返回2^2= -4

最新更新