Похоже, push_back реаллоцирует память, поэтому ссылка, полученная из v[i] после возврата из рекурсии становится неправильной. Легко увидеть, если сравнить &v[i] до и после рекурсивного вызова. Если заранее зарезервировать место в массиве, все будет работать как надо. Интересно, правда, почему программа не вылетает с ошибкой, когда происходит запись в неправильную память. Ну и можно было бы ожидать, что вектор по умолчанию резервирует хотя бы десяток элементов (вроде, некоторые варианты string так делают).