This week's book giveaway is in the Cloud/Virtualization forum.
We're giving away four copies of Learning OpenStack Networking: Build a solid foundation in virtual networking technologies for OpenStack-based clouds and have James Denton on-line!
See this thread for details.
Win a copy of Learning OpenStack Networking: Build a solid foundation in virtual networking technologies for OpenStack-based clouds this week in the Cloud/Virtualization forum!
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Liutauras Vilda
  • Campbell Ritchie
  • Tim Cooke
  • Bear Bibeault
  • Devaka Cooray
Sheriffs:
  • Jeanne Boyarsky
  • Knute Snortum
  • Junilu Lacar
Saloon Keepers:
  • Tim Moores
  • Ganesh Patekar
  • Stephan van Hulst
  • Pete Letkeman
  • Carey Brown
Bartenders:
  • Tim Holloway
  • Ron McLeod
  • Vijitha Kumara

Recursive call question  RSS feed

 
Greenhorn
Posts: 15
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
class RecTest {
int values[];

RecTest(int i){
values = new int[i];
}

void printArray(int i) {
if (i==0) return;
else printArray(i-1);
System.out.println("[" + (i-1) + "] " + values[i-1]);
}
}


public class Test {

public static void main(String args[]) {

RecTest ob = new RecTest(10);

int i;

for(i=0; i<10; i++) ob.values[i] = i;

ob.printArray(10);

}
}
 
Marshal
Posts: 4465
284
Clojure IntelliJ IDE Java
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
You have forgotten to ask a question?

You also forgot to put your code in Code Tags when posting, as you can see it is much more readable when you do.
 
Preethi Chilukuri
Greenhorn
Posts: 15
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Thank you.

I could not figure out how to include code tags.

Also,

My question:

There is a recursive call to printArray method. 


My assumption: As there are no {} around else block, only recursive call to printArray is executed.  System.out.println statement is executed only once.


My question:
How many times the following statement in the method printArray:

                                 System.out.println("[" + (i-1) + "] " + values[i-1]);


Logic and steps of execution please.  I am not able to understand this.
 
Tim Cooke
Marshal
Posts: 4465
284
Clojure IntelliJ IDE Java
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
When you compiled and ran this code, how many times did it print?
 
Master Rancher
Posts: 3630
40
  • Likes 2
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Preethi Chilukuri wrote:
My assumption: As there are no {} around else block, only recursive call to printArray is executed.  System.out.println statement is executed only once.



Think about as the code returns out of each method call.
What happens when printArray(0) is called, and return occurs on line 9?
 
Preethi Chilukuri
Greenhorn
Posts: 15
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
[0] 0
[1] 1
[2] 2
[3] 3
[4] 4
[5] 5
[6] 6
[7] 7
[8] 8
[9] 9

printed 9 times.  I could not get the logic how 9 times - System.out.println is executed... as else block do not have {} and i guess only printArray(i-1); is present in else blcok.
 
Dave Tolls
Master Rancher
Posts: 3630
40
  • Likes 2
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
As I say, think about what happens as each of the calls to printArray returns.
 
Marshal
Posts: 60127
188
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Preethi Chilukuri wrote:. . . printed 9 times. . . .

That isn't nine times.
 
Tim Cooke
Marshal
Posts: 4465
284
Clojure IntelliJ IDE Java
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I have given Dave's posts some "thumbs up" to indicate that you might want to pay attention to his posts the most.
 
Campbell Ritchie
Marshal
Posts: 60127
188
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
For each call to that recursive method, if you pass a positive integer, it calls the method for one less (so passing 2 causes the method to be invoked later with 1). Then it prints the nth element of the array, remembering that in order to find the nth element of an array, you pass n − 1. So to find the second element when the argument is 2, it uses index 1.
Once you get below the first element of the array, the test for i==0 will stop the execution.

Because you call the method with n − 1 before you print array[n], you will get the array elements printed in their normal order.
After line 10, which is inside the else, line 11 is outside any particular control structures.
 
Marshal
Posts: 6008
415
BSD
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator

Preethi Chilukuri wrote:My assumption: As there are no {} around else block, only recursive call to printArray is executed.  System.out.println statement is executed only once.


Question yourself first why there is no {} around else block while supposed to be. Fix that. So you'll have one assumption less to make.
 
Preethi Chilukuri
Greenhorn
Posts: 15
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Thank you very much for giving me hints to understand the recursive logic.

Got it!! 

Thanks all for your time.
 
Liutauras Vilda
Marshal
Posts: 6008
415
BSD
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Think that way, beware: I got some weird imagination today.

Your scenario looks like that now. Imagine there is a cave. Outside the cave there are (9) fireworks on the ground, but you can't shoot them unless you go to the cave and then come back. So, when you do a recursive call, you go to the cave. Now that you are deeper in a cave, there you can also see fireworks on the ground, but 1 less this time (8), but you can't shoot them too unless you go deeper to the cave and then come back... imagine story continues till there is only 1 firework on the ground, and yet again you decide go deeper again, you go there, and you find out that there is nowhere else to go, so you have to come back. Now that you coming back, you were told you'll be able to shoot fireworks on the way back, so you start shooting them. So you shoot 1 (the ones you saw lately), then you go back further way out and you shoot 2, then 3, then 4, ... 9 which were apparently outside the cave. And you stop, end of printArray() body.

Please don't tell you didn't like my story
 
Preethi Chilukuri
Greenhorn
Posts: 15
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Perfect story to understand recursive logic... for newbies !!



Thanks for your time for chipping in... 
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
Boost this thread!