In general, yes.
To illustrate, a simple (non-tail recursive) add function can be written as follows:
let rec (@) xs ys = match xs with | [] -> ys | x::xs' -> x::(xs' @ ys)
Thus, the inner append ( @ ) splits the first list ( xs ) and uses the cons ( :: cons operator to build the resulting list. It is easy to see that there are n steps to add ( :: , where n is the length of the first list.
source share