Haskell, 84 bytes
import Data.List h s=[k|l<-s,k<-nub["()"++l,"("++l++")",l++"()"]] (!!)$iterate h[""]
First of all:
iterate does create a recursion sequecnce of
h, but this is a builtin, and by the rules we may use builtins that use recursion.
This is just a very simple recursive approach, we can generate the n-Dyck-words by putting (n-1)-Dyck-words after, in between or before a pair of opening and closing parenthesis. This approach however does generate duplicates, that is why we filter for unique elements using
nub. With the elimination of duplicates at each recursion step (duplicates among a list of length 3) this approach is quite efficient.