我对编程很陌生,现在我已经提到了递归的概念。我已经解决了一些基本的任务,但是当我进行多次递归时,我会非常失落。我曾尝试多次解决以下递归问题,但是无法正确解决。
使用参数"ABCD"
和2
调用递归方法,即recMethod("ABCD", 2);
。
public void recMethod( String str, int n ) {
if( n >= 0 ) {
recMethod(str, n – 1);
System.out.print(str.charAt(n));
recMethod(str, n – 1);
}
}
有没有人可以解释发生了什么?第一次递归调用让我很困惑。
答案 0 :(得分:4)
了解递归的最重要的事情是没什么特别的。与方法中的所有内容一样,它需要在执行下一个语句之前完成语句:
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”,然后调用打印“A”的recMethod("ABCD",0)
。因此它打印“ABA”
如果我们看一下recMethod("ABCD",2)
。我们知道它调用recMethod("ABCD",1)
打印“ABA”,然后打印“C”,然后调用recMethod("ABCD",1)
打印“ABA”。因此它打印“ABACABA”
如果我们看一下recMethod("ABCD",3)
。我们知道它调用recMethod("ABCD",2)
打印“ABACABA”,然后打印“D”,然后调用recMethod("ABCD",2)
打印“ABACABA”。因此它打印“ABACABADABACABA”
由于"abcd".charAt(4)
不起作用,所以继续下去是没有意义的。也许代码应该对此进行测试,或者它应该是私有的,并且有一个没有n
的公开代码,以保证n
永远不会超出str
范围?
如果你要制作一个递归工作的方法,你也会这样做。
基本案例会发生什么。 (应该如何制止)
如果不是基本情况表示如果方法按预期工作,会发生什么。这里的问题是你需要确保每次对同一方法的调用都是一个稍微简单的问题,递归必然会遇到基本情况,否则你会得到无限递归!
多数民众赞成!它会起作用。
答案 1 :(得分:3)