Source: https://www.cs.cornell.edu/courses/cs2800/2015sp/lnotes/14_functions.pdf