Question: Consider the following (Haskell) code:

```
fib=0:1:zipWith (+) fib (tail fib)

```

A coworker is trying to assert that this is not a recursive function because `fib` is simply a list that defines itself with itself and that is somehow different than a function that does the same. I think he's smoking crack. 

What do you think?

Answer: 
The fibonacci definition with zipWith is not a recursive function, in fact there is no function involved, fib is a list (data) that is lazily self-defined, utilizing Haskell's lazy semantic. In a sense, you can call it recursive list or recursive data; but not recursive function.

It may be difficult to wrap your head around recursive list since very little programming languages have anything close, but you'll notice that in Haskell all functions takes exactly one paramater. `fib` does not take any parameter, because it's not a function. Since there is no function involved, you can't have recursive function.

Your coworker isn't smoking crack, he's enlightened (or smoking crack, if that's your definition of enlightenment).
For this to be recursive function, it needs to be both recursive and a function. As sepp2k points out, it's clearly recursive because the name `fib` appears on both sides of the `=`. That is, `fib` is defined in terms of itself.

Is it a function? Not according to its type. In haskell, we call a 0-argument function "data". So this definition of `fib` creates a recursive data structure, but not a recursive function.