对于以下代码段,我无法通过它进行跟踪(我需要为即将进行的测试做些。
public int question(int x, int y)
{
if (x ==y)
return 0;
else
return question(x-1, y) + 1;
}
我也很担心+ 1正在做什么。什么是1被添加到。我知道结果是五,但我需要能够更好地理解这个概念。谢谢你的帮助。
答案 0 :(得分:5)
基本上:
question(8,3)
将返回question(7,3) + 1
question(7,3)
将返回question(6,3) + 1
question(6,3)
将返回question(5,3) + 1
question(5,3)
将返回question(4,3) + 1
question(4,3)
将返回question(3,3) + 1
且question(3,3)
为0。
显而易见,question(8,3)
的结果是简单替换为5。应该注意的是,如果x < y
那么你可能会因为x
不断递减而得到堆栈溢出,并且可能永远不会到达x == y
。
答案 1 :(得分:1)
public int question(int x, int y)
{
if (x ==y)
return 0;
else
return question(x-1, y) + 1;
}
说你打电话
int result = question(5,0);
因为你的一般情况叫
return question(x-1, y) + 1;
+ 1将递归,直到你遇到
的基本情况 if (x ==y)
return 0;
给你+1 +1 +1 +1 +1 +0
直到x = 0且y = 0
答案 2 :(得分:1)
您总是可以在方法中添加一些打印件,以便更好地了解它的作用:
static int question(int x, int y) {
if (x ==y) {
System.out.println(x + " == " + y);
System.out.println("return 0");
return 0;
} else {
System.out.println(x + " != " + y);
System.out.println("call question(" + (x - 1) + ", " + y + ")");
int result = question(x - 1, y);
System.out.println("return " + result + " + 1");
return result + 1;
}
}
然后打电话给它。例如:
public static void main(String... args) {
System.out.println(question(8, 3));
}
输出:
8 != 3
call question(7, 3)
7 != 3
call question(6, 3)
6 != 3
call question(5, 3)
5 != 3
call question(4, 3)
4 != 3
call question(3, 3)
3 == 3
return 0
return 0 + 1
return 1 + 1
return 2 + 1
return 3 + 1
return 4 + 1
5
答案 3 :(得分:0)
为了理解递归,尝试以数学方式编写函数。我将首先用经典的阶乘证明这一点,然后向你解释你给出的例子。
让fact(n)
成为n!
。阶乘的递归定义是:
fact(n) = 1, if n <= 1
fact(n) = n * fact(n - 1)
请注意,我们有两种情况:基本情况,这是一个可以直接计算的简单情况,以及一个需要递归调用值的步骤情况。请注意,为了使递归起作用,递归函数调用应该更简单,以便向步骤案例移动。这可以在Java中轻松实现:
public int factorial(int n)
{
if (n < 2)
return 1;
else
return n*factorial(n-1);
}
回到你的功能,你必须向后做同样的过程。我们可以很容易地将2个基本案例识别为if:
的分支 Base case: question(x, y) = 0, if x = y
Step case: question(x, y) = question(x - 1, y) + 1, otherwise
可以注意到,在每次递归调用时,您从x中减去1并将1加到结果中。让我们展开question(8, 3)
的递归:
question(8, 3) = question(7, 3) + 1 // You are in the step case
question(7, 3) = question(6, 3) + 1
question(6, 3) = question(5, 3) + 1
question(5, 3) = question(4, 3) + 1
question(4, 3) = question(3, 3) + 1
question(3, 3) = 0 // The base case
现在,如果您在question(3, 3)
的值中替换question(4, 3)
的值并向上执行相同操作,则会发现结果为8。
没有直接的方法可以做到这一点,但你可以注意到第一个参数减少1,每次完成时,结果增加1,直到参数相等。使用一些直觉,您可能会注意到这基本上计算x - y。
请注意,此方法需要x&gt; = y,否则会崩溃。