Nice article, Big O is a bit confusing at first but you helped me figuring some things out. Also, another good example is recursive functions. While they look more stylish than for loops, too many calls may cause a function to use a lot of resources, maybe even more than nested for loops, so I guess if you need a function that requires more recursion than a tail-call, something has to be changed. Consider the fibonacci sequence function, which would need to call itself twice, whereas the for loop version only loops through cached values, thus progressing linearly instead of exponentially.