-3

我有一个简单的递归 java 文件。代码如下

public class Rekursion_SA_UE {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    count(1, 10);
}

public static int count(int zahl, int max)
{
    if(zahl>max) return zahl;
    else{
        System.out.println(zahl);
        count(zahl+1, max);
        return zahl;
    }
}

输出为 1,2,3,4,5,6,7,8,9,10。如果我切换两条线,它会从 10 向下计数。看起来像

 public class Rekursion_SA_UE {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    count(1, 10);
}

public static int count(int zahl, int max)
{
    if(zahl>max) return zahl;
    else{
        count(zahl+1, max);//switched
        System.out.println(zahl);//switched
        return zahl;
    }
}

这里的输出是 10,9,8,7,6,5,4,3,2,1。这是为什么?提前致谢。

4

2 回答 2

4

这是因为您何时调用count与何时输出号码。

在您的第一个版本中,您在递归zahl 之前count输出,因此您可以按顺序看到数字。像这样的东西(我会停在 4 点,而不是 10 点):

计数(1, 4)
    输出 1
    计数(2, 4)
        输出 2
        计数(3, 4)
            输出 3
                计数(4, 4)
                输出 4
                    计数(5, 4)
                    返回
                返回
            返回
        返回
    返回

在您的第二个版本中,您在output之前zahl递归,因此您一直进入递归(十级),然后当它开始展开时,您开始输出最深的数字(10)。类似的东西(我再次使用 4,而不是 10):

计数(1, 4)
    计数(2, 4)
        计数(3, 4)
            计数(4, 4)
                计数(5, 4)
                    返回
                输出 4
                返回
            输出 3
            返回
        输出 2
        返回
    输出 1
    返回

要理解这样的行为,请使用调试器并单步执行代码。在 2013 年,无需猜测代码在做什么。你可以它运行,看看到底发生了什么。

于 2013-11-10T12:04:36.530 回答
1

它与递归的工作方式有关。它就像一棵树。你的第一个片段是这样的:

call(1)
    print(1)
    call(2)
        print(2)
        call(3)
            //etc.

你的第二个片段是这样的:

 call(1)
     call(2)
         call(3)
             //etc.
         print(3)
     print(2)
 print(1)
于 2013-11-10T12:08:01.443 回答