Как вывести рекурсивно?
Не очень понял, что вы не поняли. 
Вот есть функция createData, она рисует список элементов из массива, который передается ей в параметре l. Все. 
В функции проходимся по каждому значению из l. Имеется условие: если l это строка, то выводим ее в li, если же это массив, то вероятно это список дочерних элементов, которые нужно вывести в отдельный блок ul. Для этой цели рекурсивно (рекурсивно, значит вызов функции самой себя) вызываем функцию createData и передаем ей уже не массив всех элементов, а лишь массив дочерних элементов текущего элемента из цикла. И там опять все также, смотрим на элементы, если у элемента есть дочерние элементы, опять вызываем createData.
Это не рекурсия. Если по-простому, рекурсия - это когда функция вызывает сама себя или две функции взаимно вызывают друг друга.
Здесь же в цикл передаётся массив, который через оператор in поэлементно считывается в key, а затем выводится. А ещё инициализация переменной data здесь явно излишняя.