Below is recursive function which operates on integers, a non-tree-like input
const add = (x, y) =>
x + y
const sumTo = (x = 0) =>
x === 0
? x
: add (x, sumTo (x - 1))
console.log (sumTo ()) // 0
console.log (sumTo (1)) // 1
console.log (sumTo (2)) // 3
console.log (sumTo (4)) // 10
Yet it evolves a tree-like (recursive) computation – sumTo (4)
...
add ( 4
, add ( 3
, add ( 2
, add ( 1
, 0
)
)
)
)
// => 10
A tail-recursive version has a different computational process, though. This is distinction is the same made by Dirk Herrmann (another answer here)
const add = (x, y) =>
x + y
const sumTo = (x = 0, acc = 0) =>
x === 0
? acc
: sumTo (x - 1, acc + x)
console.log (sumTo ()) // 0
console.log (sumTo (1)) // 1
console.log (sumTo (2)) // 3
console.log (sumTo (4)) // 10
In this case, when tail call elimination is available, sumTo (4)
evolves an iterative computation
sumTo (3, 4)
sumTo (2, 7)
sumTo (1, 9)
sumTo (0, 10)
// => 10
So to answer your question, no. Recursive procedures (functions that reference themselves by their own name) may or may not evolve recursive processes.
This topic is talked about in Structure and Interpretation of Computer Programs, section 1.2.1