Java 在一个方法中调用递归两次会发生什么?

Java 在一个方法中调用递归两次会发生什么?,java,recursion,Java,Recursion,我对编程相当陌生,现在我已经了解了递归的概念。我已经解决了一些基本的任务,但当我谈到多重递归时,我就迷路了。我已经多次尝试解决下面的递归问题,但都做不好 使用参数“ABCD”和2调用递归方法,即recMethod(“ABCD”,2) 有人能解释发生了什么吗?第一个递归调用真的让我困惑。对我来说,理解递归最好的方法就是把它一行一行地写在纸上。我现在为你的案子做了什么 请尝试做同样的事情,不要犹豫,问更多的问题,我希望这有帮助 了解递归最重要的一点是它没有什么特别之处。与方法中的所有内容一样,它需要

我对编程相当陌生,现在我已经了解了递归的概念。我已经解决了一些基本的任务,但当我谈到多重递归时,我就迷路了。我已经多次尝试解决下面的递归问题,但都做不好

使用参数
“ABCD”
2
调用递归方法,即
recMethod(“ABCD”,2)


有人能解释发生了什么吗?第一个递归调用真的让我困惑。

对我来说,理解递归最好的方法就是把它一行一行地写在纸上。我现在为你的案子做了什么


请尝试做同样的事情,不要犹豫,问更多的问题,我希望这有帮助

了解递归最重要的一点是它没有什么特别之处。与方法中的所有内容一样,它需要先完成一条语句,然后才能执行下一条语句:

public void someMethod() {
  someOtherMethod();
  someLastMethod();
}
看看我的示例,很明显,
someLastMethod
将在
someOtherMethod
完成后调用。如果用递归的方法替换
someOtherMethod
,这其实并不重要。它需要在调用
someLastMethod
之前完成。再次查看递归方法时:

public void recMethod( String str, int n ) {
    if( n >= 0 ) {
        recMethod( str, n – 1 );
        System.out.print( str.charAt( n ) );
        recMethod( str, n – 1 );
    } else { // base case added for clarity
        return;
    }
}
对于
n>=0
的每次调用,在调用
System.out.print
方法之前,必须调用
recMethod
。每个对recMethod的调用都有自己的
n
str
,因此它们可以被视为完全不同的方法,只是它们的代码“非常相似”

每个调用要么匹配基本情况,要么需要相同方法的结果,n递减,因此我喜欢从基本情况开始,然后向后工作,即n为
-1
。假设您调用
recMethod(“ABCD”,-1)
会发生什么?嗯,它不打印任何内容或“”

然后我看一下recMethod(“ABCD”,0)
,它调用基本情况,我们知道它不做任何事情,然后打印“A”,然后它调用与第一条语句相同的语句,而第一条语句同样也不做任何事情。因此,它打印“A”

如果我们看一下
recMethod(“ABCD”,1)
。我们知道它调用
recMethod(“ABCD”,0)
打印“A”,然后它打印“B”,然后调用
recMethod(“ABCD”,0)
打印“A”。因此它打印“ABA”

如果我们看看
recMethod(“ABCD”,2)
。我们知道它调用
recMethod(“ABCD”,1)
打印“ABA”,然后它打印“C”,然后调用
recMethod(“ABCD”,1)
打印“ABA”。因此,它打印“阿巴卡巴”

如果我们看看
recMethod(“ABCD”,3)
。我们知道它调用
recMethod(“ABCD”,2)
打印“ABACABA”,然后它打印“D”,然后调用
recMethod(“ABCD”,2)
打印“ABACABA”。因此,它打印“阿巴卡巴卡”

既然
“abcd”.charAt(4)
不起作用,继续下去就没有意义了。也许代码应该对此进行测试,或者它应该是私有的,并且应该有一个没有
n
的公共测试,以保证
n
永远不会超出
str
界限

如果你要做一个递归工作的方法,你也要做同样的事情

  • 基本情况下应该发生什么。(应该如何停止)

  • 如果它不是表示为该方法按预期工作的基本情况,该怎么办。这里需要注意的是,您需要确保对相同方法的每次调用都是一个稍微简单的问题,递归必然会遇到基本情况,否则您将得到无限递归


  • 就这样!它会起作用。

    您的问题中没有递归。我更改了方法的名称以使示例更清晰,但忘记了更改方法中的名称。理想情况下,如果它是迭代解决方案,则命中基本情况会使方法的流程中断。但是在这种情况下,如果它碰到了基本情况,它将在递归方法之后继续处理代码。对吗?@被打败的狗有一个回路,你可以在不理会你的回溯结构的情况下提前退出。在递归中,您可以检查第一个结果,以确定是返回它还是执行第二个结果。这将使它以同样的方式工作。在Scheme中,您甚至可以使用
    call/cc
    ,这样当您知道最终结果时,您就可以跳过调用堆栈中的等待工作,因此相似性会更大。。当前方法是否会从内存中销毁?我仍然不知道第二个递归调用将如何开始执行?因为我能得到的是,如果该方法将从内存中销毁,那么
    if
    块将用于其余语句(第二次递归调用)…如果我错了,请纠正我。
    public void recMethod( String str, int n ) {
        if( n >= 0 ) {
            recMethod( str, n – 1 );
            System.out.print( str.charAt( n ) );
            recMethod( str, n – 1 );
        } else { // base case added for clarity
            return;
        }
    }