Dijkstra was in favor of several kinds of abstraction, one of which is operational abstraction. This kind of abstraction is best illustrated by means of the subroutine concept.
In the relation between main program and subroutine we can distinguish quite clearly two different semantic levels. On the level of the main program the subroutine represents a primitive action; on that level it is used on account of "what it does for us" and on that same level it is irrelevant "how it works". On the level of the subroutine body we are concerned with how it works but can --and should-- abstract from how it is used. [EWD302]
But when dealing with a recursive procedure, the two semantic levels "what it does" and "how it works" overlap. This observation, in turn, explains why a different mental skill is required when writing a recursive procedure. [EWD302]