跟踪递归函数

时间:2015-04-24 01:14:24

标签: java function recursion

对于以下代码段,我无法通过它进行跟踪(我需要为即将进行的测试做些。

public int question(int x, int y)
{
    if (x ==y)
        return 0;
    else
        return question(x-1, y) + 1;
}

我也很担心+ 1正在做什么。什么是1被添加到。我知道结果是五,但我需要能够更好地理解这个概念。谢谢你的帮助。

4 个答案:

答案 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)

每次将函数recurses 1添加到int的返回值时,将<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,否则会崩溃。