简体   繁体   中英

What happens when recursion is called twice in a method?

I'm pretty new to programming and I have now come to the concept of recursion. I have solved a few basic assignments but when I come to multible recursion I get terribly lost. I have tried to solve the following recursion several times but just cant get it right.

A recursive method is called with the arguments "ABCD" and 2 , ie 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);
  }
}

Is there somebody out there who can explain what is going on? The first recursive call really confuses me.

The most important thing to know about recursion is that it's nothing special . As with everything in a method it needs to finish a statement before the next statement can be executed:

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

Looking at my example it's obvious that someLastMethod will be called after someOtherMethod has finished. It really doesn't matter if you replace someOtherMethod with something recursive. It needs to finish before someLastMethod can be called. When looking at your recursive method again:

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

For each call where n >= 0 , before the System.out.print method is called the call to recMethod has to be called. Every call to recMethod has it's own n and str so they can be considered different methods entirely except their code is 'very similar'.

Every call will either match base case or need the result of the same method with n decremented so I like to start from the base case and work myself backwards, which is when n is -1 . Imagine you call recMethod("ABCD",-1) what would happen? Well it prints nothing or "".

I then look at recMethod("ABCD",0) and it calls the base case, which we know does nothing, then prints "A" and then it calls the same as the first statement which again does nothing. Thus it prints "A"

If we look at recMethod("ABCD",1) . We know it calls recMethod("ABCD",0) which prints "A", then it prints "B", then call recMethod("ABCD",0) which prints "A". Thus it prints "ABA"

If we look at recMethod("ABCD",2) . We know it calls recMethod("ABCD",1) which prints "ABA", then it prints "C", then call recMethod("ABCD",1) which prints "ABA". Thus it prints "ABACABA"

If we look at recMethod("ABCD",3) . We know it calls recMethod("ABCD",2) which prints "ABACABA", then it prints "D", then call recMethod("ABCD",2) which prints "ABACABA". Thus it prints "ABACABADABACABA"

Since "abcd".charAt(4) won't work it doesn't make sense to go on. Perhaps the code should have a test for this or perhaps it should be private and have a public one without n that guarantees n never goes beyond str bounds?

If you were to make a method that works recursively you do the same.

  1. What should happen for the base case. (How should it stop)

  2. What should happen if it's not the base case expressed as if the method works as intended. The catch here is that you need to make sure that each call to the same method here is a slightly simpler problem which the recursion is bound to hit a base case or else you get infinite recursion!

Thats it! It will work.

The best way to understand recursion as for me is to write it on the paper line by line. What I did for your case now. 在此处输入图片说明

Please try to do the same, and don't hesitate to ask more question, I hope it helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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