https://npl.codingforstudent.com/programming-algorithms-recursion/