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;
}
}