What to do in recitation? Forgive me if this is not the right place to ask pedagogical questions, but it seemed the most appropriate.

I am a TA for a programming/CS course. This is my first time teaching recitation and I'm not really sure what the best approach is. What I've been doing is covering what the professor asked me to, with a mix of lecturing (which I don't really like as I feel the students get enough of that) and me solving problems on the board with their help (which is OK but it's usually the same students answering the questions).

I can think of several different methods of recitation:


Lecturing (elucidating ideas or going over proofs)
Solving problems with the students
Having a class discussion, which sounds great, but coming up with discussion topics for this type of course is difficult, I feel
Having the students solve worksheets (which seems unnecessary considering they already have enough homework)
Or having them work together in groups to solve more difficult problems


Can anyone provide insight for which of these ideas are most effective?

Further information: It's a summer course, so the pace is pretty fast. Furthermore there are three recitations a week, each an hour and a half. It's the second CS course, so it's mostly programming (data structures and safe code) with a bit of theory thrown in.
I train graduate students to lead biology discussion sections, but the philosophy should transfer...

I think your instincts are excellent - students do not need more lectures. What they often need help with is figuring out what they do not understand, and learning how to overcome being "stuck." That, and practice with feedback. Some suggestions, particularly since summer courses are so fast. I'm going to assume they have homework, and that the homework can be worked on in a discussion environment (you will not be "doing their homework for them").


Instruct students to bring their homework problem set. Look over the problems yourself the night before, and determine the easy ones from the hard ones, and make notes to yourself where students are likely to get stuck.
When students arrive, tell them to start work on a difficult problem. Plan on giving them 5-10 minutes -- whatever they need until many of them slow down. Walk around as they work and just see how they choose to work.
After several are stuck (it may take you practice to figure out what question to use to get this level of difficulty), have them get into groups of three and compare their techniques and what they found difficult. Walk around again and ask questions like, "Tell me how far you are. Can you show me a part that is difficult? Can you get out your lecture notes and find the section relevant to this problem?"
Usually at this point you will see a sticky point that more than one student is wrestling with. Now is a great time to pull everyone's attention back to the front of the room and you can work through that problem (or one similar) and answer questions for 5-10 minutes. 
Have students return to the problem and complete it. Have them go back and do a simpler problem on their own to reinforce.
Rinse and repeat.


Using discussion time like this makes students happy because they are getting their homework done. Smarter students help slower students, which keeps them engaged. You as an instructor learn a lot about what students don't understand, which is often a complete surprise. Plus, it's active and not boring and doesn't require a huge amount of prep.

If this gets really dull, you can have small-group competitions where students have a single sheet of scratch paper and have to respond to a prompt you flash on the screen. I like to split the room into the right half (five groups of 3 students) and left half (five groups of 3 students) and have competitions like this for "basics" material. The half of the room with the groups with the most right answers gets a point for each round of competition. Everyone participates, but the answer is the group's and so shame for wrong answers is reduced.