No it's not. What makes a language functional is its ability to eliminate tail recursion.
I don't think the author is seriously of the belief that C is a functional language. This is just a fun little example of writing C in a functional style.
int factorial(int x) {
if (x > 1) return x * factorial(x-1);
else return 1;
}
will be optimized by GCC to int factorial(int x) {
int result = 1;
while (x > 1) result *= x--;
return result;
}
(http://ridiculousfish.com/blog/posts/will-it-optimize.html)Having first-class function values in the first place strikes me as way more important. Purity helps, too.
What would happen without tail call elimination?
Summing up numbers is inherently strict, so you'd want tail call elimination for that. But functional mainstains, like say, map or filter are usually not implemented with tail recursion in Haskell, because that would be too strict and would break on infinite lists.