Can you do something like Python's yield statement in Mathematica, in order to create generators? See e.g. here for the concept.
Update Here's an example of what I mean, to iterate over all Permutations, using only O(n) space: (Algorithm as in Sedgewick's Algorithms book):
gen[f_, n_] := Module[{id = -1, val = Table[Null, {n}], visit},
visit[k_] := Module[{t},
id++; If[k != 0, val[[k]] = id];
If[id == n, f[val]];
Do[If[val[[t]] == Null, visit[t]], {t, 1, n}];
id--; val[[k]] = Null;];
visit[0];
]
Then call it it like:
gen[Print,3]
, printing all 6 permutations of length 3.