An iterative design approach can span any time-box from weekly cycles up to a traditional or discovery type of timeline. I’ve worked on all ends of the spectrum. After defining the problem, they all include some form of the following phases.

Define the problem
While it’s tempting to jump straight into a solution, it’s important to take even a few minutes to clearly define the problem(s) that need to be solved and then to move forward with a timeline that best suits it.
Ideate
One of my favorite parts of the process is coming up with as many ideas to solve the problem as I can, without judgement. Stockpiling these ideas in whatever form you want gives you a way to track, prioritize and evaluate them. But these can also be throwaway once the best solution(s) are evaluated.
Create & Iterate
After looking at the ‘best-fit’ ideas for pros and cons, it’s best to focus on 2-3 and flesh them out in quick sketches or wire-frames. Putting quick pencil to paper or pixels to screen it’s easier to see which one solves the problem in the most user friendly way. My favorite term for this is ‘pre-totyping’ and is often internal to teams but could also be put in front of users or user surrogates, folding in feedback and improving in as many cycles as the timeline allows for.
Evalute & Execute
As the funnel of refinement narrows down to final answers, formal user testing can help create the final solution before moving into specifications, annotated mocks and prototypes/code for handover to engineering partners, who hopefully have been part of the process in some way (always helpful for them to have previous context before starting to code, but not always possible).