You can derive the formula for this using the Chinese Remainder Theorem.<p>Consider the problem of finding a polynomial p(x) such that p(x_i) = y_i for some finite set of (x_i) and (y_i). The classic approach to this is <i>Lagrange interpolation</i>, which can be seen as a special case of the Chinese Remainder Theorem. Essentially, you are trying to find a p which satisfies the following modular congruences:<p><pre><code> p(x) == y_i (mod (x - x_i))
</code></pre>
The constructive proof of CRT, specialised to this problem, yields an algorithm equivalent to Lagrange interpolation. To extend Lagrange interpolation so as to include derivative information y'_i at each x_i, change that congruence to:<p><pre><code> p(x) == y_i + y'_i (x - x_i) (mod (x - x_i)^2)
</code></pre>
And to give second derivative information, change the modular congruence to:<p><pre><code> p(x) == y_i + y'_i (x - x_i) + y''_i (x - x_i)^2 / 2! (mod (x - x_i)^3)
</code></pre>
And so on...
Bezier curves are actually my favorite way to teach recursion. They give a nice visual representation of what's happening, the base case is pretty straight forward, and so is the math. The time-step element adds just enough extra complexity to take it beyond "let's sum a list" or "check if a string is a palindrome".
For a really in-depth, online resource on Bézier curves, I constantly consult <a href="https://pomax.github.io/bezierinfo/" rel="nofollow">https://pomax.github.io/bezierinfo/</a>
If you happen to desire to implement your own NURBS library, (and/or the bspline and bezier simplifications) take the nurbs book c reference implementation, and modernize, convert to you language of choice.<p><a href="https://link.springer.com/book/10.1007/978-3-642-97385-7" rel="nofollow">https://link.springer.com/book/10.1007/978-3-642-97385-7</a>
Grant Sanderson (3blue1brown) had a video submission contest and the winner that blew me away did a video on bezier curves. <a href="https://youtu.be/aVwxzDHniEw" rel="nofollow">https://youtu.be/aVwxzDHniEw</a>