To understand it properly look at the diagram carefully and follow the recursive top-to-down approach while reading the graph. 
Here, xstr = "ABCD"
      ystr = "BAEC"
                                    lcs("ABCD", "BAEC")       // Here x != y 
                                  /                     \  
                lcs("BCD", "BAEC")   <--  x==y   -->    lcs("ABCD", "AEC")  x==y
                          |                                        |
                          |                                        |
                  lcs("CD", "AEC")   <--  x!=y   -->     lcs("BCD", "EC")
                 /                \                     /                \
                /                  \                   /                  \
               /                    \                 /                    \
      lcs("D","AEC")                  lcs("CD", "EC")              lcs("BCD", "C")
    /                \              /               \              /        \       
lcs("", "AEC")        lcs("D","EC")                  lcs("CD", "C")        lcs("BCD","")
  |        \         /              \                       |             /       |
Return     lcs("", "EC")    lcs("D" ,"C")            lcs("D", "")   lcs("CD","")  Return
           /         \       /         \             /        \       /        \ 
        Return      lcs("","C")    lcs("D","") lcs("","")  Return  lcs("D","")  Return
                     /     \         /     \      /                 /      \
                  Return   lcs("","")       Return            lcs("", "")  Return
                                 |                                  |
                              Return                            Return
NOTE:  The proper way of representation of recursive call is usually done by using tree approach, but here i used the graph approach just to compress the tree so one can easy understand the recursive call in a go. And, of course it would be easy to me to represent.
- Since, in the above diagram there are some redundant pairs like - lcs("CD", "EC")which is the result of deletion of- "A"from the- "AEC"in- lcs("CD", "AEC")and of- "B"from the- "BCD"in- lcs("BCD", "EC"). As a result, these pairs will be called more than once while execution which increases the time complexity of the program.
 
- As you could easily see that every pair generates two outcomes for its next level until it encounters any empty string or - x==y. Therefore, if the length of the strings are n, m (considering the length of the xstr is- nand ystr is- mand we are considering the worst case scenario). Then, we will have number outcomes at the end of the order : 2n+m. (How? think)
 
Since, n+m is an integer number let's say N. Therefore, the time complexity of the algorithm : O(2N), which is not efficient for lager values of N.
Therefore, we prefer Dynamic-Programming Approach over the recursive Approach. It can reduce the time complexity to: O(n.m) => O(n2) , when n == m.
Even now, if you are getting hard time to understand the logic, i would suggest you to make a tree-like (not the graph which i have shown here) representation for xstr = "ABC" and ystr = "EF". I hope you will understand it.
Any doubt, comments most welcome.