I certainly don't disagree with Stephen that you don't want to hand-optimize code until you see the profiling to prove that it matters, but many times the conversion to tail-recursive form requires knowing that operations are associative. (In the case of floating point addition, for instance, it is NOT associative, but often one pretends that it is.)