繁体   English   中英

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

[英]What happens when recursion is called twice in a method?

我对编程还很陌生,现在我有了递归的概念。 我已经解决了一些基本的任务,但是当我进行多重递归时,我会迷路。 我试图几次解决以下递归问题,但无法正确解决。

使用参数"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);
  }
}

那里有人可以解释发生了什么吗? 第一次递归调用确实使我感到困惑。

关于递归最重要的事情是,它没有什么特别的 与方法中的所有内容一样,它需要先完成一条语句,然后才能执行下一条语句:

public void someMethod() {
  someOtherMethod();
  someLastMethod();
}

看我的示例,很明显, someOtherMethod完成后将调用someLastMethod 如果您用递归的方式替换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的调用都有其自己的nstr因此可以将它们完全视为不同的方法,只是它们的代码“非常相似”。

每个调用要么匹配基本情况,要么需要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”。 因此它打印“ ABACABA”

如果我们看一下recMethod("ABCD",3) 我们知道它调用了recMethod("ABCD",2) ,它打印“ ABACABA”,然后它打印“ D”,然后调用recMethod("ABCD",2) ,它打印“ ABACABA”。 因此它打印“ ABACABADABACABA”

由于"abcd".charAt(4)无法正常工作,因此没有意义继续下去。 也许代码应该对此有一个测试或也许它应该是私人和有没有公众一个n ,保证n从来没有超越str的边界?

如果要创建一种递归工作的方法,请执行相同的操作。

  1. 基本情况会发生什么。 (应该如何停止)

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

而已! 它会工作。

对我来说,理解递归的最好方法是将它逐行写在纸上。 我现在为您做的事情。 在此处输入图片说明

请尝试做同样的事情,不要犹豫,问更多问题,希望对您有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM