Source: https://www.cs.wm.edu/~tadavis/cs312/pascalf.pdf