简体   繁体   中英

Can someone help me understand these 2 pieces of code [Recursion]?

I'm having a hard time trying to understand what is going on in this code. Out of the 14 questions we had for homework, these were the only 2 that I got stuck on and just put down the answer without knowing how they got to the answer. Any help would be appreciated, thank you.

Here is #1:

public void printDollarSign(int k)
{
        int j;
        if (k>0)
        {
              for (j=1; j<= k; j++)
                  System.out.print("$");
              System.out.println();
              printDollarSign(k-1);
        }
}

What will be the output if the call is: printDollarSign(5); ?

Answer is:

$$$$$

$$$$

$$$

$$

$

Here is #2:

public void bbb(String s, int p)
{
    if (p>= 0)
    { 
        bbb(s,p-1);
        System.out.print(s.charAt(p)); 
    }
}

What will the output be if the call is: bbb("January" , 4); ?

Answer is:

Janua

Explanation for printDollarSign :

  • Here you have created a recursive function.
  • Every recursive function has a base condition.In your case its if (k>0).
  • Every recursive call decrements the value of k by 1.Hence for each recursive call ,the number of times your for loop runs is reduced by 1.

For the First call:

  1. Suppose k = 5 ;
  2. Function call printDollarSign(5);
  3. Check if(k > 0 ) ie 5 > 0 ;
  4. For loop runs for 5 times and prints 5 "$" signs;
  5. A println prints a line break;
  6. Recursive call printDollarSign(4);

printDollarSign(k) first prints k number of $'s, then prints a newline and then calls printDollarSign(k-1) first to print k-1 number of $'s, then to print a newline and then to call printDollarSign(k-1-1)... this continues until k=0. When k=0, printDollarSign(0) prints nothing.

Your first one, is creating a function with a specific parameter of an int, in this case "k".

  • It is then setting an int called j via "int k;"
  • It is then checking if k is greater than 0
  • After checking it is looping through k (where j = 1 and j < k) and printing out a "$" sign
  • It will produce "$$$$$".."$$$$".. etc.. till k < 0
  • Then write a new line, then call the function again minusing 1 from k

Code:

public void printDollarSign(int k){ //Define function
        int j;//Define j as an int
        if (k>0){//Check if k is greater than 0
             for (j=1; j<= k; j++)//Loop through k where j = 1
                 System.out.print("$");//Print $ by the amount of k
             System.out.println();//Print a new line
             printDollarSign(k-1);//Re run the function
        }
}

Your second question is creating a function with two parameters of string and int "s" and "p"

  • Its checking if p is greater than 0
  • Then calling the function inside itself minusing 1 from p (p-1)
  • Its then printing out a character from your string based on p

Code:

public void bbb(String s, int p){//Define Function
    if (p>= 0){ //Check if p is greater than 0
        bbb(s,p-1);//Rerun function
        System.out.print(s.charAt(p));//Print character of string based on p
    }
}

Add code comments for explanation:

1#

public void printDollarSign(int k)
    {
        // temporary variable j, it will be always initialized to 1 inside the for loop.
        int j;
        // only executed to be true if k is more than 0, that means if K is initially 5
        // then it only works for 5,4,3,2,1  and not for 0.
        if (k>0)
        {
            // always starts with 1 and goes to the value of k, that means if K is currently 5
            // then it will print 5 dollars, if 4 then 4 dollars and so on
            for (j=1; j<= k; j++)
                System.out.print("$");
            // a new line will be added once dollars are printed.
            System.out.println();
            // this will again call the same function and decrements the value of k, so next time 
            // k will have the value one less then the previous one, if this has printed 5 dollars 
            // in last iteration next time it will print 4 dollars and so on
            printDollarSign(k-1);
        }
    }

2#

public void bbb(String s, int p)
    {
        // only print a character if p has a value grater than 0. in you case , p has a value 4 that
        // mean only 4 characters will be printed at max
        if (p>= 0)
        { 
            // recuresively call same method by decrementing p, so it will be
            // [bbb(s,3) prints 'a']-> [bbb(s,3) prints 'u']-> bbb(s,2) [prints 'n']-> [bbb(s, 1) prints 'a']> [bbb(s, 0) prints 'J']
            // last character will be printed first
            bbb(s,p-1);
            // prints the character at p location
            System.out.print(s.charAt(p)); 
        }
    }

Explanation for bbb :

  • It's an application of recursion to extract a substring from the given string.
  • Base condition if (p>= 0).
  • You should be aware about the fact that for each and every recursion call the value of "P" is stored in the stack.
  • As you know stack is a Last In First Out(LIFO) data structure , the last value inserted into the stack will be popped out first.

Execution:

  1. bbb("January" , 4); --> Stack contains : [4]
  2. bbb("January" , 3); --> Stack contains : [3 4]
  3. bbb("January" , 2); --> Stack contains : [2 3 4]
  4. bbb("January" , 1); --> Stack contains : [1 2 3 4]
  5. bbb("January" , 0); --> Stack contains : [0 1 2 3 4]

Now pop out each element and print the char at that position

  1. After 0 -> J
  2. After 1 -> Ja
  3. After 2 -> Jan
  4. After 3 -> Janu
  5. After 4 -> Janua
if you provide a string s as 'January', the way it stores is like this:
0th position = J, 
1th position = a,
2th position = n,
3th position = u,
4th position = a,
5th position = r,
6th position = y,
Just like an array of characters. 
When you provide p=4, you are setting the closing criteria for the condition    check. 

function bbb('January', 4){
if(4>=0){
bbb('January', 3); ....

function bbb('January', 3){
if(3>=0){
bbb('January', 2); ....

function bbb('January', 2){
if(2>=0){
bbb('January', 1); ....

function bbb('January', 1){
if(1>=0){
bbb('January', 0); ....

function bbb('January', 0){
if(0>=0){
bbb('January', -1); ....

function bbb('January', -1){
if(-1>=0){ Here condition check fails.. hence char at(-1) doec not print

return goes back to print of previous call and prints J as p=0, we have J
the p=1: a
p=2: n
p=3: u
p=4: a

and function finishes...

Kindly let me know if the explanation was helpful

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