How exactly does tail recursion work?

前端 未结 8 1592
粉色の甜心
粉色の甜心 2020-12-07 07:39

I almost understand how tail recursion works and the difference between it and a normal recursion. I only don\'t understand why it doesn\'t

8条回答
  •  抹茶落季
    2020-12-07 07:47

    The recursive function is a function which calls by itself

    It allows programmers to write efficient programs using a minimal amount of code.

    The downside is that they can cause infinite loops and other unexpected results if not written properly.

    I will explain both Simple Recursive function and Tail Recursive function

    In order to write a Simple recursive function

    1. The first point to consider is when should you decide on coming out of the loop which is the if loop
    2. The second is what process to do if we are our own function

    From the given example:

    public static int fact(int n){
      if(n <=1)
         return 1;
      else 
         return n * fact(n-1);
    }
    

    From the above example

    if(n <=1)
         return 1;
    

    Is the deciding factor when to exit the loop

    else 
         return n * fact(n-1);
    

    Is the actual processing to be done

    Let me the break the task one by one for easy understanding.

    Let us see what happens internally if I run fact(4)

    1. Substituting n=4
    public static int fact(4){
      if(4 <=1)
         return 1;
      else 
         return 4 * fact(4-1);
    }
    

    If loop fails so it goes to else loop so it returns 4 * fact(3)

    1. In stack memory, we have 4 * fact(3)

      Substituting n=3

    public static int fact(3){
      if(3 <=1)
         return 1;
      else 
         return 3 * fact(3-1);
    }
    

    If loop fails so it goes to else loop

    so it returns 3 * fact(2)

    Remember we called ```4 * fact(3)``

    The output for fact(3) = 3 * fact(2)

    So far the stack has 4 * fact(3) = 4 * 3 * fact(2)

    1. In stack memory, we have 4 * 3 * fact(2)

      Substituting n=2

    public static int fact(2){
      if(2 <=1)
         return 1;
      else 
         return 2 * fact(2-1);
    }
    

    If loop fails so it goes to else loop

    so it returns 2 * fact(1)

    Remember we called 4 * 3 * fact(2)

    The output for fact(2) = 2 * fact(1)

    So far the stack has 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)

    1. In stack memory, we have 4 * 3 * 2 * fact(1)

      Substituting n=1

    public static int fact(1){
      if(1 <=1)
         return 1;
      else 
         return 1 * fact(1-1);
    }
    

    If loop is true

    so it returns 1

    Remember we called 4 * 3 * 2 * fact(1)

    The output for fact(1) = 1

    So far the stack has 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1

    Finally, the result of fact(4) = 4 * 3 * 2 * 1 = 24

    The Tail Recursion would be

    public static int fact(x, running_total=1) {
        if (x==1) {
            return running_total;
        } else {
            return fact(x-1, running_total*x);
        }
    }
    
    
    1. Substituting n=4
    public static int fact(4, running_total=1) {
        if (x==1) {
            return running_total;
        } else {
            return fact(4-1, running_total*4);
        }
    }
    

    If loop fails so it goes to else loop so it returns fact(3, 4)

    1. In stack memory, we have fact(3, 4)

      Substituting n=3

    public static int fact(3, running_total=4) {
        if (x==1) {
            return running_total;
        } else {
            return fact(3-1, 4*3);
        }
    }
    

    If loop fails so it goes to else loop

    so it returns fact(2, 12)

    1. In stack memory, we have fact(2, 12)

      Substituting n=2

    public static int fact(2, running_total=12) {
        if (x==1) {
            return running_total;
        } else {
            return fact(2-1, 12*2);
        }
    }
    

    If loop fails so it goes to else loop

    so it returns fact(1, 24)

    1. In stack memory, we have fact(1, 24)

      Substituting n=1

    public static int fact(1, running_total=24) {
        if (x==1) {
            return running_total;
        } else {
            return fact(1-1, 24*1);
        }
    }
    

    If loop is true

    so it returns running_total

    The output for running_total = 24

    Finally, the result of fact(4,1) = 24

提交回复
热议问题