Passing lists around and TCO are different things. TCO stands for “Tail Call Optimization”, and roughly happens when your recursive call is the last expression in your function. This way, the runtime does not need to keep the stack around until your recursion ends but discards the stack after each call. This way, your recursion is not limited by available memory regarding stack (your accumulator may grow if you don’t care).
Read more here