iterative algorithm