Hi tbaohoang,
It depends, recursive workflows can take into account the previous iteration of the workflow (since workflow iteration 1 schedules workflow iteration 2 etc.). If the result of the action performed on an object determines whether the action should be performed on the next object, use a recursive workflow.
To use your example. if sending out an email to a recipient should only be performed if sending the email to the previous recipient was succesful, use a recursive workflow. If you just want to send out 3000 emails on the press of a button, use schedule on a list. And if you want to send out 3000 emails daily, use a recurring event or a recursive workflow with a schedule WF on a list action. Keep in mind that bubble mentioned they want to move away from recursive workflows and provide an easier alternative, see this post New workload management tool: Infinite recursion protection - #8 by steven.harrington.