Suppose you know you have a recursive function and it has multiple recursive paths. And suppose the parameters are i and j. And suppose function name is func.
Recursive paths.
func(i+1,j)
func(i+1,j+1)
func(i,j+2)
You can see that if you go through 1 st path twice and 3rd path once you come to a situation where current i and j values equals to previous respective values +2. (i+2,j+2).
Then you can also see that if you go through 2nd path twice it leads to the same situation as i+2 and j+2.
You can get the basic idea that this scenario will lead to calculation of function for same parameters twice.
And we can't guarantee that which takes first place.
So you can make a list or some sort of storing mechanism to store that calculation. like mem[i,j] = calculated value if mem[i,j] = none or false or something. You get the idea.
This is my general idea of memoization. May be you can see some sort of patterns in you code other than this. And there may be situations you can guarantee that which paths takes place first according to your logic. So you can guess that there will be situations where this will not occur even for multiple recursive calls. And also there may be different ways ,recursive paths to have same parameters like the above situation(in this case integer addition)